Як я можу видалити весь текст між фігурними дужками у текстовому файлі з рядком?


10

Приклад:

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

Стають:

This is 
that wants
 anyway.

Я знайшов кілька подібних тем на форумі, але вони, схоже, не працюють з багаторядковими фігурними дужками.

Якщо можливо, я віддаю перевагу якомусь однолінійному методу, як, наприклад, рішення, засновані на grep, sed, awk ... і т.д.

EDIT: Рішення здаються нормальними, але я помітив, що мої оригінальні файли містять фігурні дужки, що вкладаються. Тож я відкриваю нове питання. Дякуємо всім: Як я можу видалити весь текст між вкладеними фігурними дужками у текстовий файл багаторядкових?


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. Таким чином команда заміщення повторюється, поки всі групи брекетів не будуть видалені.


Ваша відповідь здається ідеальною. Поки нове запитання, яке я щойно відкрив (прочитайте оригінальне запитання EDIT), не зовсім те саме, я думаю, ви повинні відповісти і на нього. Чи було б нормально з правилами форуму?
Sopalajo de Arrierez

@ 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, більше часу, тоді я визнаю (годин ... каф..кашля)
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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.