2011-06-08 17 views
22

Jak wstawić linię do pliku przy użyciu sed przed wzorem i po numerze linii? A jak używać tego samego w skrypcie powłoki?jak wstawić linię za pomocą sed przed wzorem i po numerze linii?

ta wstawia linię przed każdym zgodnie z wzorem:

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

A to zmienia to przy użyciu zakres numerów linia:

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

Więc teraz, jak z nich korzystać zarówno (co nie mogłem” t), aby wstawić linię do pliku przy użyciu sed przed wzorem i po numerze linii lub innym podejściu?

Odpowiedz

21

Można napisać sed plik skryptu i zastosowanie:

sed -f sed.script file1 ... 

Albo można użyć (wielokrotny) -e 'command' opcje:

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

Jeśli chcesz dodać coś po linii, a następnie :

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

Więc Jonathan, jeśli mam w tym formacie XML :: Jak używać sed dodać linię "”przed znacznikiem? – Nohsib

+0

Wyjaśniałem, dzięki za pomoc: sed -i -e '8, $ s/<\/vendor>/testing /' -e '/ testing/i \ '-e' 8, $ s/testing/<\/vendor>/'vendors1.xml – Nohsib

+0

dla mnie, aby to działało w miejscu, musiałem zrobić' sed -i' 22a Tekst został dodany na linii 22 ' test.txt' – jamescampbell

7

Zakładam, że chcesz wstawić linię przed wzorcem tylko wtedy, gdy numer linii dzierżawy jest większy niż pewna wartość (tj. jeśli występuje wzorzec przed numerem linii, nic nie robić)

Jeśli nie jesteś przywiązany do sed:

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

+1: Zastanawiałem się, czy tak powinno być interpretowane pytanie, ale podałem prostszą odpowiedź, która wydaje się być pomocna. Byłoby trudno osiągnąć ten efekt w "sed" - prawdopodobnie nie całkiem niemożliwe, ale z udziałem zagnieżdżonych poleceń itp. –

0

tutaj jest przykładem, jak wstawić linię przed linią w pliku:

przykład plik test.txt:

hello line 1 
hello line 2 
hello line 3 

scenariusz:

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

wyjściowy plik test.txt.2

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

NB! Zauważ, że sed ma jako początek zastąpienie nowej linii bez spacji - jest to konieczne, w przeciwnym razie plik wynikowy będzie miał jedną pustą linię na początku

Skrypt wyszuka wiersz zawierający "hello line 2", a następnie wstawi nowa linia powyżej - "cześć nowej linii"

wyjaśnieniem poleceń 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. 
Powiązane problemy