Tengo un archivo de texto simple que contiene varias líneas de datos en la que cada línea tiene exactamente 26 caracteres.
E. g.

10001340100491938001945591
10001340100491951002049591
10001340100462055002108507
10001340100492124002135591
10001340100492145002156507
10001340100472204002205591

Ahora, quiero cambiar los días 12 y 13 de personaje, si sólo estos dos personajes son 49 con caracteres 58.

He intentado de esta manera:

sed 's/^(.{12})49//' data.txt

pero estoy recibiendo este error:

sed: -e expression #1, char 18: invalid reference  on `s' command's RHS

Gracias de antemano

InformationsquelleAutor user333422 | 2014-06-28

3 Comentarios

  1. 4

    El grupo capturado es \1, por lo que desea colocar el 11 (12) caracteres, entonces 58:

    sed -E 's/^(.{11})49/8/' data.txt
    

    También necesita -E o -r si usted no desea escapar de la plaza y llaves.

    Con su entrada, el comando cambia 49 a 58 en las líneas 1, 2, 4 y 5.

    • Esto funcionó. Gracias. Estoy usando sed por primera vez. Así que si yo no los uso -E ¿cómo será la expresión parece?
    • Gracias, lo he conseguido. sed ‘s/^(.\{11\})49/\158/’ data.txt
    • Con mi versión de sed es sed 's/^\(.\{11\}\)49/\158/' data.txt
  2. 5

    Si quieres probar un awk solución:

    awk 'substr($0,12,2)==49 {$0=substr($0,1,11)"58"substr($0,14)}1' file
    10001340100581938001945591
    10001340100581951002049591
    10001340100462055002108507
    10001340100582124002135591
    10001340100582145002156507
    10001340100472204002205591
    
  3. 2

    En su expresión se sustituye el primero de 14 caracteres (si lo tienes a la derecha). Pero usted necesita para reemplazar 11 además de los dos (12, 13). Lo que es más importante, sed es exigente respecto a escapar de los soportes, por lo que necesita barras en la parte delantera de \( y { etc. Finalmente, el número de captura de grupo es 1. Se omite ese número.

    Poniendo todo junto, se obtiene

    sed 's/^\(.\{11\}\)49/8/'
    

    Hay indicadores que se pueden utilizar en sed a hacer de las expresiones más «regular» (cambiando el significado de ( vs \(). Lo de la bandera que es depende de su plataforma (versión de sed), creo.

    • Esto no funciona, aunque es similar a la de abajo. En lugar de reemplazar 49 al 58, es anexando 58 después de 49 y hacer que la cadena de 28 caracteres de largo
    • Eso es porque el capturado grupo incluye 11 caracteres y 49.
    • sí, yo siento que hubo una transposición de caracteres. El 49 tenía que estar fuera de la captura de grupo, de modo que no se repite durante la sustitución. He editado mi respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here