Подход Perl:
$ perl -F"" -a00ne 'for (@F){$i++ if /{/; $i||print; $i-- if /}/}' file
This is
that wants
anyway
объяснение
-a
: включает автоматическое разбиение по разделителю файла, заданному -F
в @F
массиве.
-F""
: устанавливает пустой разделитель поля ввода, в результате чего каждый элемент @F
становится одним из символов ввода.
-00
: включить «режим абзаца», где «строка» определяется как два последовательных символа новой строки. Это означает, что весь файл в этом случае будет рассматриваться как одна строка. Если в вашем файле может быть много абзацев, а скобки могут занимать несколько абзацев, используйте -0777
вместо этого.
-ne
: прочитайте входной файл и примените скрипт, заданный -e
для каждой строки.
Сам сценарий на самом деле довольно прост. Счетчик увеличивается на единицу каждый раз, когда {
видно, и уменьшается на единицу для каждого }
. Это означает, что когда счетчик равен 0, мы не в скобках и должны вывести:
for (@F){}
: сделать это для каждого элемента @F
, каждого символа в строке.
$i++ if /{/;
: увеличение $i
на единицу, если этот символ{
$i||print;
: печать, если $i
не установлено (0 считается неустановленным).
$i-- if /}/
: уменьшение $i
на единицу, если этот символ}