2011-07-22 19 views
16

Jakie byłoby polecenie sed dla skryptów powłoki Mac, które zastąpiłyby wszystkie iteracje ciągu "lis" z całą zawartością łańcucha pliku myFile.txt.Użyj zawartości pliku, aby zastąpić ciąg znaków przy użyciu SED

Plik myFile.txt byłby treścią html ze znakami kreskowymi i wszystkimi rodzajami znaków. Przykładem może być

</div> 
    </div> 
    <br> 
    <div id="container2"> 
    <div class="question" onclick="javascript:show('answer2')";> 

Dzięki!

EDIT 1

To mój rzeczywisty kod:

sed -i.bkp '/Q/{ 
s/Q//g 
r /Users/ericbrotto/Desktop/question.txt 
}' $file 

Gdy uruchomię go uzyskać:

sed in place editing only works for regular files. 

I w moich plikach Q otrzymuje tony chińskich znaków (!). Dziwaczny!

+0

Zobacz http://stackoverflow.com/questions/6684487/sed-replace-with-variable-with-multiple-lines/6685563#6685563. To byłoby jedno rozwiązanie. Powodzenia. – shellter

+0

Informacje na temat edycji 1 ... Oryginalne pliki są dostępne z rozszerzeniem '.bkp'. Jaka jest zawartość twojego pliku 'question.txt'? Ponadto, jaka jest zawartość plików przywoływanych przez '$ file'.Czy jest jakiś plik binarny? Jakie jest ich kodowanie? – brandizzi

+0

Zawartość pliku question.txt jest dokładnie taka jak w powyższym html. Pliki, do których odwołuje się plik $ są plikami .txt. Czy coś jest nie tak z moją częścią .bkp? Czy powinienem zmienić to na .txt? Natychmiast sprawdzę kodowanie mojego pliku question.txt. –

Odpowiedz

40

Można użyć polecenia r. Po znalezieniu 'lisa' w wejściu ...

/fox/{ 

... wymienić go za nic ...

s/fox//g 

... i odczytać pliku wejściowego:

r f.html 
} 

Jeśli masz plik, takich jak:

$ cat file.txt 
the 
quick 
brown 
fox 
jumps 
over 
the lazy dog 
fox dog 

roku wynik jest:

$ sed '/fox/{ 
    s/fox//g 
    r f.html 
}' file.txt 
the 
quick 
brown 

    </div> 
    </div> 
    <br> 
    <div id="container2"> 
    <div class="question" onclick="javascript:show('answer2')";> 
jumps 
over 
the lazy dog 
dog 
    </div> 
    </div> 
    <br> 
    <div id="container2"> 
    <div class="question" onclick="javascript:show('answer2')";> 

EDIT: zmienić przetwarzanego pliku, po prostu przekazać flagi -i do sed:

sed -i '/fox/{ 
    s/fox//g 
    r f.html 
}' file.txt 

Niektóre wersje sed (takie jak moje własne jeden) wymaga, aby zdać rozszerzenie do flagi -i, który będzie rozszerzenie pliku kopii zapasowej ze starej zawartości pliku:

sed -i.bkp '/fox/{ 
    s/fox//g 
    r f.html 
}' file.txt 

I tu jest to samo, jako jednej liniowej, która jest również kompatybilny z Makefile

sed -i -e '/fox/{r f.html' -e 'd}' 
+0

To działa całkowicie! Daj temu człowiekowi medal honorowy! Ostatnią rzeczą Brandizzi ... jest drukowanie na konsoli, ale nie na plik. Czy możemy uzyskać trochę kodu, aby to zrobić? Stukrotne dzięki! –

+0

Pewnie, że możesz! Edytowałem swoją odpowiedź. – brandizzi

+0

Brandizzi. Uzyskanie dziwnego zachowania. Czy mógłbyś sprawdzić moją edycję 1? –

2

Ostatecznie co poszedłem z którym jest dużo prostsze niż wiele rozwiązań znalazłem w Internecie:

str=xxxx 
sed -e "/$str/r FileB" -e "/$str/d" FileA 

Obsługuje szablonów tak:

str=xxxx 
sed -e "/$str/r $fileToInsert" -e "/$str/d" $fileToModify 
+0

To faktycznie działa. –

+1

to nie działa, gdy dopasowany str nie jest w jednym wierszu. Spowoduje to zastąpienie całej linii zawartością pliku fileToInsert, nawet jeśli część łańcucha jest zgodna – saGii

Powiązane problemy