it-swarm.com.de

wie füge ich eine Linie mit sed vor einem Muster und nach einer Zeilennummer ein?

Wie füge ich eine Zeile mit sed vor einem Muster und nach einer Zeilennummer in eine Datei ein? Und wie man das gleiche in einem Shell-Skript verwendet?

Dies fügt vor jeder Zeile mit dem Muster eine Zeile ein:

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

Und dies ändert sich mit dem Zeilennummernbereich:

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

Wie kann ich nun beide verwenden (was ich nicht konnte), um eine Zeile mit sed vor einem Muster und nach einer Zeilennummer oder einem anderen Ansatz in eine Datei einzufügen?

26
Nohsib

Sie können entweder eine sed-Skriptdatei schreiben und verwenden:

sed -f sed.script file1 ...

Oder Sie können (mehrere) -e 'command'-Optionen verwenden:

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

Wenn Sie nach einer Zeile etwas anhängen wollen, dann:

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

Ich gehe davon aus, dass Sie die Zeile nur dann vor einem Muster einfügen möchten, wenn die aktuelle Zeilennummer größer als ein Wert ist (d. H., Wenn das Muster vor der Zeilennummer auftritt, tun Sie nichts).

Wenn Sie nicht an sed gebunden sind:

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

Einfach? Von Zeile 12 bis zum Ende:

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

hier ist ein Beispiel, wie eine Zeile vor einer Zeile in einer Datei eingefügt wird:

beispieldatei test.txt:

hello line 1
hello line 2
hello line 3

skript:

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

ausgabedatei test.txt.2

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

NB! Beachten Sie, dass der sed zu Beginn keine neue Zeile durch eine neue Zeile ersetzt hat - dies ist erforderlich, da die Datei sonst eine leere Zeile am Anfang hat

Das Skript findet die Zeile, die "Hallo Zeile 2" enthält, und fügt oben eine neue Zeile ein - "Hallo neue Zeile".

erklärung der sed-Befehle:

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