Cómo insertar una línea en un archivo mediante la sed antes de un patrón y después de un número de línea? Y cómo el uso de la misma en la secuencia de comandos de shell?

Esto inserta una línea antes de cada línea con el patrón :

sed '/Sysadmin/i \ Linux Scripting' filename.txt

Y esto cambia el uso de este número de la línea de la gama :

sed '1,$ s/A/a/'

Así que ahora de cómo utilizar estos dos (que yo no podía) para insertar una línea en un archivo mediante la sed antes de un patrón y después de un número de línea o de otro enfoque?

InformationsquelleAutor Nohsib | 2011-06-08

4 Comentarios

  1. 26

    Usted puede escribir una sed archivo de secuencia de comandos y el uso:

    sed -f sed.script file1 ...

    O puede utilizar (varios) -e 'command' opciones:

    sed -e '/SysAdmin/i\
    Linux Scripting' -e '1,$s/A/a/' file1 ...

    Si quieres agregar algo después de que una línea, entonces:

    sed -e '234a\
    Text to insert after line 234' file1 ...
    • Por lo que Jonathan, si tengo xml en este formato :: <nombre del proveedor=»XEROX CORPORATION»> <vendorOUI oui=»000000″ description=»XEROX CORPORATION» /> <vendorOUI oui=»000001″ description=»XEROX CORPORATION» /> <vendorOUI oui=»000002″ description=»XEROX CORPORATION» /> </proveedor> ¿Cómo puedo usar sed para agregar una línea «<vendorOUI oui=»222222″ description=»XEROX CORPORATION» />» antes de la </proveedor> etiqueta?
    • he descubierto, gracias por la ayuda: sed-i -e ‘8,$ s/<\/proveedor,>/pruebas/’ -e ‘/pruebas/i\ <vendorOUI oui=\»000007\» description=\»XEROX CORPORATION\» \/>’ -e ‘8,$ s/prueba/<\/proveedor,>/’ vendors1.xml
    • para mí para conseguir que esto funcione en el lugar, tuve que hacer sed -i '22a Text I Added at Line 22' test.txt
    • eso significa que usted está usando GNU sed y también significa que usted quería para sobrescribir el archivo original. Aquellos no eran necesariamente parte de los requisitos originales. No está mal; solo (ligeramente) diferentes. El uso de BSD sed, que había necesidad de utilizar -i ‘’ en lugar de sólo -i, usted no será capaz de engañar en la especificación POSIX y omitir la barra diagonal inversa de salto de línea.
    • gracias eso es una gran explicación y tiene sentido ahora.
  2. 8

    Supongo que usted quiere insertar la línea antes de un patrón sólo si el número de línea actual es mayor que un cierto valor (es decir, si el patrón se produce antes de que el número de la línea de no hacer nada)

    Si no estás ligado a sed:

    awk -v lineno=$line -v patt="$pattern" -v text="$line_to_insert" '
        NR > lineno && $0 ~ patt {print text}
        {print}
    ' input > output
    • +1: me preguntaba si esa era la forma de la pregunta debe ser interpretado demasiado, pero dio la respuesta más simple que parece haber sido de ayuda. Sería duro para lograr ese efecto en sed – probablemente no es del todo imposible, pero la participación de comandos anidados, etc.
  3. 0

    aquí es un ejemplo de cómo insertar una línea antes de una línea en un archivo:

    archivo de ejemplo test.txt :

    hello line 1
    hello line 2
    hello line 3

    guión:

    sed -n 'H;${x;s/^\n//;s/hello line 2/hello new line\n&/;p;}' test.txt > test.txt.2

    archivo de salida de la prueba.txt.2

    hello line 1
    hello new line
    hello line 2
    hello line 3

    NB! observe que la sed tiene como principio una sustitución de una nueva línea a ningún espacio – esto es necesario de lo contrario archivo resultante tendrá una línea vacía en el principio

    El script encuentra la línea que contiene «hola» línea 2″, a continuación, inserta una nueva línea de arriba – «hola nueva línea»

    explicación de sed comandos:

    sed -n:
    suppress automatic printing of pattern space
    
    H;${x;s/test/next/;p}
    
    /<pattern>/  search for a <pattern>
    ${}  do this 'block' of code
    H    put the pattern match in the hold space
    s/   substitute test for next everywhere in the space
    x    swap the hold with the pattern space
    p    Print the current pattern hold space. 
  4. 0

    Simple? A partir de la línea 12 para el final:

    sed '12,$ s/.*Sysadmin.*/Linux Scripting\n&/' filename.txt
    • Que funciona bien con GNU sed; no funciona con todas las otras variantes. He probado específicamente con el BSD/macOS variante de sed y produce Linux ScriptingnSysadmin por ejemplo. También he probado el mismo guión con GNU sed y funcionó — todo lo que cambió fue la ruta del comando ejecutado.
    • Gracias por la explicación. Yo ahora recuerdo que tuve problemas con los saltos de línea en Solaris y AIX «hace mucho tiempo».

Dejar respuesta

Please enter your comment!
Please enter your name here