Sed zastępuje zdanie w wielu wierszach

11

Jestem nowy w używaniu sed, ale eksperymentowałem z sedem s/..../..../(zamiennikiem), aby zmodyfikować pełne zdanie, jeśli jest ono w jednym wierszu, ale nie jestem świadomy alternatywnego rozwiązania, w jaki sposób zmodyfikować zdanie, które mogło być rozdzielone w dwóch wierszach, takie jak:

To:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

jest napisane w następujący sposób:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

Jak możesz to wykryć lub zakodować, aby zastąpić całe zdanie, nawet jeśli jest w dwóch wierszach zamiast w jednym?

DᴀʀᴛʜVᴀᴅᴇʀ
źródło
Świetna książka referencyjna sed: Definitive Guide to sed Tutorial and Reference autorstwa Daniel A. Goldman ISBN: 978-1-939824-01-1 (wersja EPUB) 08148804441822
Joe

Odpowiedzi:

16

Następujące polecenie będzie działać w obu sytuacjach:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Więcej wyjaśnień: Jak użyć seda do zastąpienia ciągu wieloliniowego?

Radu Rădeanu
źródło
3
@Gilles Rozumiem twoje dobre intencje, ale proszę przetestuj wcześniej, aby zepsuć moją odpowiedź. Lepiej, jeśli masz inną opinię, dodaj inną odpowiedź lub zostaw komentarz.
Radu Rădeanu,
Witamy w Stack Exchange. Ta strona jest edytowana wspólnie. Jeśli nie podoba ci się pomysł, aby Twój wkład był wspólnie edytowany przez innych zaufanych użytkowników, może to nie być witryna dla Ciebie. Zauważyłem, że twój kod zastąpił więcej niż konkretną frazę, która była zamierzona, więc zredagowałem frazę w.
Gilles „SO - przestań być zły”,
@Gilles Proszę, nie musisz być złośliwy. Powinieneś także zauważyć, że twój „kod” absolutnie nic nie zastąpił . Jak powiedziałem, rozumiem twoje dobre intencje. Z mojego przykładu przypuszczam, że OP rozumie, jak zastąpić zdanie w wielu wierszach sed, niczym więcej. I to jest pytanie tytułowe. W tytule nie chodzi o perl.
Radu Rădeanu,
Nie, kod, który opublikowałem, działa. (Z wyjątkiem sytuacji, gdy Loremznajduje się w ostatnim wierszu, defekt dzieli się z twoją wersją.)
Gilles „SO- przestań być zły”,
Ten przykład nie działa, gdy są 3 lub więcej wierszy tekstu :(
artnikpro
12

Chociaż sed może dopasowywać wzory na wielu liniach (za pomocą poleceń Nlub Hdołączać kolejne linie przed dopasowaniem), jest to znacznie poza jego strefą komfortu. Spróbuj to tylko, jeśli lubisz ból.

Perl potrafi ładnie robić takie rzeczy. Użyj -pprzełącznika, aby przetwarzał standardowe dane wejściowe po jednym rekordzie i drukował zmodyfikowany rekord (à la sed), a -000także włączał tryb akapitowy (gdzie rekordy są oddzielone pustymi wierszami). W wyrażeniu regularnym \spasuje do dowolnego znaku spacji, w tym nowego wiersza.

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

Jeśli chcesz wstawić nowy wiersz w tekście zastępczym, gdy oryginał zawiera jeden wiersz, jest to bardziej skomplikowane. Jak to zrobić, zależy od twoich wymagań, gdzie umieścić nową linię.

Gilles „SO- przestań być zły”
źródło
@terdon Ach, chciałem pozwolić na wiele białych znaków, ale zapomniałem. Dzięki, naprawione.
Gilles „SO- przestań być zły”
Pytanie dotyczy sed. Jest również oznaczony sed, a nie perl.
Radu Rădeanu,
0

sed nie może łatwo odczytać wielu wierszy. Użyj perl -i -0pe 's/.../.../...'zamiast tego.

Do zrobienia
źródło
7
sed może czytać w wielu wierszach!
Radu Rădeanu,
3
@ RaduRădeanu Technicznie tak. Ale rzadko jest to warte kłopotu.
Gilles „SO- przestań być zły”,
3
@Gilles Jeśli korzystanie perljest dla Ciebie prostsze, nie oznacza to, że sedrzadko warto.
Radu Rădeanu,