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