Przykład:
This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.
Powinno stać się:
This is
that wants
anyway.
Znalazłem podobne wątki na forum, ale wydaje się, że nie działają one z nawiasami klamrowymi zawierającymi wiele wierszy.
Jeśli to możliwe, wolałbym metodę jednowierszową, na przykład rozwiązania oparte na grep, sed, awk ... itd.
EDYCJA: Rozwiązania wydają się być OK, ale zauważyłem, że moje oryginalne pliki zawierają zagnieżdżone nawiasy klamrowe. Otwieram więc nowe pytanie. Dziękujemy wszystkim: Jak mogę usunąć cały tekst między zagnieżdżonymi nawiasami klamrowymi w wielowierszowym pliku tekstowym?
text-processing
sed
awk
grep
Sopalajo de Arrierez
źródło
źródło
sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Odpowiedzi:
Wyjaśnienie:
:again;$!N;$!b again;
Spowoduje to odczytanie całego pliku do obszaru wzorów.
:again
to etykieta.N
czyta w następnym wierszu.$!b again
wraca doagain
etykiety pod warunkiem, że nie jest to ostatni wiersz.s/{[^}]*}//g
To usuwa wszystkie wyrażenia w nawiasach klamrowych.
W systemie Mac OSX spróbuj:
Zagnieżdżone szelki
Weźmy to jako plik testowy z dużą ilością zagnieżdżonych nawiasów klamrowych:
Oto modyfikacja do obsługi zagnieżdżonych nawiasów klamrowych:
Wyjaśnienie:
:again;$!N;$!b again
Jest tak samo jak poprzednio: czyta się w całym pliku.
:b
To definiuje etykietę
b
.s/{[^{}]*}//g
Spowoduje to usunięcie tekstu w nawiasach klamrowych, o ile tekst nie będzie zawierał nawiasów wewnętrznych.
t b
Jeśli powyższe polecenie zastąpienia spowodowało zmianę, wróć do etykiety
b
. W ten sposób polecenie zastępcze jest powtarzane, aż wszystkie grupy nawiasów zostaną usunięte.źródło
EDIT
), nie jest dokładnie takie samo, myślę, że powinieneś również na nie odpowiedzieć. Czy byłoby zgodne z regulaminem forum?Perl:
Jeśli chcesz edytować w miejscu
Odczytuje plik jako pojedynczy ciąg i wykonuje globalne wyszukiwanie i zamianę.
Będzie to obsługiwać zagnieżdżone stężenia:
źródło
Sed:
rozpoczęło się od linii z
{
i otrzymaj następną linię (N
), aż{}
można dokonać podstawienia ( ) (T
oznacza powrót do znaku wykonanego przez,:
jeśli podstawienie nie zostanie wykonane)Trochę zmodyfikuj, aby było prawdziwe, jeśli wiele zawinięć w jednym wierszu
Usuń wszystkie symbole w nawiasach (z
[^}]
wyjątkiem każdego symbolu,right bracket
abysed
nie był zachłanny), a jeśli pozostanie w wierszuleft bracked
- wróć, aby zacząć od dodanego następnego wiersza, jeśli nie maright bracket
.źródło