web-dev-qa-db-fra.com

comment insérer une ligne en utilisant sed avant un motif et après un numéro de ligne?

Comment insérer une ligne dans un fichier en utilisant sed avant un motif et après un numéro de ligne? Et comment utiliser la même chose dans le script shell?

Ceci insère une ligne avant chaque ligne avec le motif:

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

Et cela change ceci en utilisant la plage de numéros de ligne:

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

Alors maintenant, comment utiliser ces deux (ce que je ne pouvais pas) pour insérer une ligne dans un fichier en utilisant sed avant un motif et après un numéro de ligne ou une autre approche?

26
Nohsib

Vous pouvez écrire un fichier de script sed et utiliser:

sed -f sed.script file1 ...

Ou vous pouvez utiliser (plusieurs) options -e 'command':

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

Si vous voulez ajouter quelque chose après une ligne, alors:

sed -e '234a\
Text to insert after line 234' file1 ...
23
Jonathan Leffler

Je suppose que vous voulez insérer la ligne avant un modèle uniquement si le numéro de ligne actuel est supérieur à une valeur (c'est-à-dire si le modèle se produit avant le numéro de ligne, ne faites rien).

Si vous n'êtes pas lié à sed:

awk -v lineno=$line -v patt="$pattern" -v text="$line_to_insert" '
    NR > lineno && $0 ~ patt {print text}
    {print}
' input > output
7
glenn jackman

Simple? De la ligne 12 à la fin:

sed '12,$ s/.*Sysadmin.*/Linux Scripting\n&/' filename.txt
0
Walter A

voici un exemple montrant comment insérer une ligne avant une ligne dans un fichier:

exemple de fichier test.txt:

hello line 1
hello line 2
hello line 3

scénario:

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

fichier de sortie test.txt.2

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

NB! notez que le sed a comme début la substitution d'une nouvelle ligne à aucun espace - ceci est nécessaire sinon le fichier résultant aura une ligne vide au début

Le script trouve la ligne contenant "hello line 2", puis insère une nouvelle ligne au-dessus - "hello new line"

explication des commandes sed:

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. 
0
serup