Oto moje rozwiązanie używając awk
:
$ awk '{$1=$1}1' FS=\' OFS="\\\'" ORS='\\n' <<< "I'm happy.
You're sad."
Wynika to w wyjście
I\'m happy.\nYou\'re sad.\n
Objaśnienie:
ja ustawić pole Separator (FS
) do '
(uciekając go za shell
jako \'
) i Wyjście Pole Separator (OFS
) do \'
(zawinięte w "..."
do ucieczki '
dla shell
i ucieczki \
dwukrotnie , raz dla shell
i drugi raz dla awk
, jako "\\\'"
). Bez dalszych opcji Record Separator (RS
) jest znak nowej linii, ale ustawić Wyjście Record Separator (ORS
) do \n
(znowu uciekając \
dla awk
jak \\n
).
Teraz pozostaje tylko powiedzieć awk
zrobić to ponownie obliczać każdy rekord (poprzez ustawienie $1
do $1
, nic się nie zmienia, ale awk
myśli rekord zmieniło, skutecznie zastępując FS
przez OFS
und zatem każdy '
przez \'
) i wydrukuj każdy rekord (tak wygląda wzór 1
: 1
jest prawdziwy dla wszystkich rekordów i ponieważ nie podano żadnej akcji, wykonywane jest standardowe działanie {print $0}
), skutecznie zastępując RS
przez ORS
, a zatem każdy nowy wiersz przez \n
.
Nie trzeba uruchamiać 2 sed poleceń, można uruchomić wiele podstawienia wewnątrz jednej sed pw. Myślę, że każdy z nich jest zakończony znakiem ";" znak, chociaż jeśli to nie zadziała, to po prostu umieść 2 linie w pliku i użyj "sed -f" –
slacy
@slacy: sed -e 's/foo/bar/g' -e 's/baz/qux/g ' –
tego nie wiedział. dzięki! – Chaitan