2012-06-28 13 views
7

Próbuję wstawić zawartość pliku przed danym wzoremKorzystanie sed wstawić zawartość pliku

Oto mój kod:

sed -i "" "/pattern/ { 
i\\ 
r $scriptPath/adapters/default/permissions.xml" 
}" "$manifestFile" 

Dodaje ścieżkę zamiast zawartości pliku.

Wszelkie pomysły?

Odpowiedz

20

Aby wstawić wzór przed, należy zamienić obszar wzoru na miejsce do przechowywania przed odczytaniem w pliku. Na przykład:

sed "/pattern/ { 
     h 
     r $scriptPath/adapters/default/permissions.xml 
     g 
     N 
    }" "$manifestFile" 
+0

Skrypt musi być podwójnie cytowany, w przeciwnym razie skrypt $ scriptPath nie zostanie rozwinięty. Czy mógłbyś wyjaśnić, dlaczego na końcu potrzebny jest N? – hipe

+0

@hipe Polecenie r umieszcza tylko kolejkę odczytu do wstawienia do strumienia wyjściowego. W rzeczywistości nic nie czyta do końca cyklu lub odczytu następnego wiersza. Bez N plik nie zostanie wstawiony, dopóki nie zostanie wydrukowany obszar wzorca, dzięki czemu będzie on funkcjonował raczej jako dopełnienie niż wstawka. Jest * bardzo * nieintuicyjny. –

+0

Dobrze dla mnie działa, dzięki bardzo dziękuję – ridan

4

Po prostu usuń i\\.

Przykład:

$ cat 1.txt 
abc 
pattern 
def 

$ echo hello > 2.txt 

$ sed -i '/pattern/r 2.txt' 1.txt 

$ cat 1.txt 
abc 
pattern 
hello 
def 
+3

Wstawia po wzorze. Jak wstawić zawartość przed nim? – ridan

1

mam coś takiego za pomocą awk. Wygląda brzydko, ale wystarczyły w moim teście:

polecenie:

cat test.txt | awk ' 
/pattern/ { 
    line = $0; 
    while ((getline < "insert.txt") > 0) {print}; 
    print line; 
    next 
} 
{print}' 

test.txt:

$ cat test.txt 
some stuff 
pattern 
some other stuff 

insert.txt:

$ cat insert.txt 
this is inserted file 
this is inserted file 

wyjściowa:

some stuff 
this is inserted file 
this is inserted file 
pattern 
some other stuff 
0

rozwiązanie CodeGnome nie działają, jeśli wzór jest w ostatnim wierszu .. Więc użyłem 3 komend.

sed -i '/pattern/ i\ 
     INSERTION_MARKER 
     ' $manifestFile 
sed -i '/INSERTION_MARKER/r $scriptPath/adapters/default/permissions.xml' $manifestFile 
sed -i 's/INSERTION_MARKER//' $manifestFile 
Powiązane problemy