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 cela 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?

25
demandé sur rogerdpack 2011-06-09 00:01:14

3 réponses

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

sed -f sed.script file1 ...

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

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 ...
22
répondu Jonathan Leffler 2011-06-08 20:09:53

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

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
répondu glenn jackman 2011-06-09 14:09:25

Voici un exemple de la façon d'insérer une ligne avant une ligne dans un fichier:

Exemple de test de fichier.txt:

hello line 1
hello line 2
hello line 3

Script:

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

Test du fichier de sortie.txt.2

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

NB! notez que le sed a comme début une 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", il insère ensuite une nouvelle ligne au-dessus de -- " hello new la ligne"

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
répondu serup 2016-10-07 10:45:33