Podejście Perla:
$ perl -F"" -a00ne 'for (@F){$i++ if /{/; $i||print; $i-- if /}/}' file
This is
that wants
anyway
Wyjaśnienie
-a
: Włącza automatyczne dzielenie na separatora pliku podanego przez -F
do @F
tablicy.
-F""
: ustawia separator pól wejściowych na pusty, co spowoduje, że każdy element @F
będzie jednym ze znaków wejściowych.
-00
: włącz „tryb akapitowy”, w którym „wiersz” jest zdefiniowany jako dwa kolejne znaki nowej linii. Oznacza to, że cały plik w tym przypadku będzie traktowany jako pojedynczy wiersz. Jeśli plik może zawierać wiele akapitów, a nawiasy mogą obejmować wiele akapitów, użyj -0777
zamiast tego.
-ne
: przeczytaj plik wejściowy i zastosuj skrypt podany przez -e
dla każdej linii.
Sam skrypt jest w rzeczywistości dość prosty. Licznik jest zwiększany o jeden za każdym razem, gdy {
jest widoczny i zmniejszany o jeden dla każdego }
. Oznacza to, że gdy licznik ma wartość 0, nie znajdujemy się w nawiasach kwadratowych i powinniśmy wydrukować:
for (@F){}
: zrób to dla każdego elementu @F
, każdego znaku w linii.
$i++ if /{/;
: przyrost $i
o jeden, jeśli ta postać to{
$i||print;
: drukuj, chyba że $i
jest ustawiony (0 jest liczone jako nieustawione)
$i-- if /}/
: zmniejszenie $i
o jeden, jeśli ta postać to}