Как удалить весь текст в фигурных скобках в многострочном текстовом файле?

10

Пример:

This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.

Должно стать:

This is 
that wants
 anyway.

Я нашел несколько похожих тем на форуме, но они не работают с многострочными фигурными скобками.

Если возможно, я бы предпочел какой-либо однострочный метод, например решения, основанные на grep, sed, awk ... и т. Д.

РЕДАКТИРОВАТЬ: Решения, кажется, в порядке, но я заметил, что мои оригинальные файлы включают в себя фигурные скобки. Итак, я открываю новый вопрос. Спасибо всем: как я могу удалить весь текст между вложенными фигурными скобками в многострочном текстовом файле?

Сопалахо де Арриерес
источник
1
Попробуйте этоsed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Костас

Ответы:

10
$ sed ':again;$!N;$!b again; s/{[^}]*}//g' file
This is 
that wants
 anyway.

Объяснение:

  • :again;$!N;$!b again;

    Это читает весь файл в пространство образца.

    :againэто ярлык. Nчитает в следующей строке. $!b againвозвращается к againметке при условии, что это не последняя строка.

  • s/{[^}]*}//g

    Это удаляет все выражения в фигурных скобках.

На Mac OSX попробуйте:

sed -e ':again' -e N -e '$!b again' -e 's/{[^}]*}//g' file

Вложенные Брекеты

Давайте возьмем это в качестве тестового файла с множеством вложенных скобок:

a{b{c}d}e
1{2
}3{
}
5

Вот модификация для обработки вложенных фигурных скобок:

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5

Объяснение:

  • :again;$!N;$!b again

    Это то же самое, что и раньше: оно читается во всем файле.

  • :b

    Это определяет метку b.

  • s/{[^{}]*}//g

    Это удаляет текст в фигурных скобках, если текст не содержит внутренних фигурных скобок.

  • t b

    Если приведенная выше команда замены привела к изменению, вернитесь к метке b. Таким образом, команда замещения повторяется до тех пор, пока все группы скобок не будут удалены.

John1024
источник
Ваш ответ кажется идеальным. Пока новый вопрос, который я только что открыл (читай оригинальный вопрос EDIT), не совсем тот же самый, я думаю, что вы также должны ответить на него. Будет ли это нормально с правилами форума?
Сопалайо де Арриерес
@ John1024, вы можете перенести свою правку сюда, так как ОП опубликовал новый вопрос о том же.
Рамеш
1
ОК. Я скопировал его туда и изменил, чтобы использовать образец текста в новом вопросе.
John1024
5

Perl:

perl -0777 -pe 's/{.*?}//sg' file

Если вы хотите редактировать на месте

perl -0777 -i -pe 's/{.*?}//sg' file

Это читает файл как одну строку и выполняет глобальный поиск и замену.

Это будет обрабатывать вложенные скобки:

perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'
Гленн Джекман
источник
Спасибо, это было очень полезно! Это помогло мне решить проблему с помощью скрипта сборки, чтобы заменить содержимое функции в течение нескольких минут против борьбы с sed с помощью ah..em, больше времени, чем я признаю (часы..cough..cough)
AndrewD
4

Sed:

sed '/{/{:1;N;s/{.*}//;T1}' multiline.file

Начиная с строки с {и получая следующую строку ( N) до тех пор, пока {}не будет произведена замена ( ) ( Tозначает возврат к метке, выполненной, :если замена не сделана)

Немного измените, чтобы быть правдой, если много скручивания в одной строке

sed ':1; s/{[^}]*}// ; /{/ { /}/!N ; b1 }' multiline.file

Удалить все символы в скобках ( [^}]равно каждый символ Зависитright bracket , чтобы sedне жадными), и если в строке остается left bracked- назад , чтобы начать с следующей строкой добавляется , если нет right bracket.

Костас
источник