Пример:
This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.
Должно стать:
This is
that wants
anyway.
Я нашел несколько похожих тем на форуме, но они не работают с многострочными фигурными скобками.
Если возможно, я бы предпочел какой-либо однострочный метод, например решения, основанные на grep, sed, awk ... и т. Д.
РЕДАКТИРОВАТЬ: Решения, кажется, в порядке, но я заметил, что мои оригинальные файлы включают в себя фигурные скобки. Итак, я открываю новый вопрос. Спасибо всем: как я могу удалить весь текст между вложенными фигурными скобками в многострочном текстовом файле?
text-processing
sed
awk
grep
Сопалахо де Арриерес
источник
источник
sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Ответы:
Объяснение:
:again;$!N;$!b again;
Это читает весь файл в пространство образца.
:again
это ярлык.N
читает в следующей строке.$!b again
возвращается кagain
метке при условии, что это не последняя строка.s/{[^}]*}//g
Это удаляет все выражения в фигурных скобках.
На Mac OSX попробуйте:
Вложенные Брекеты
Давайте возьмем это в качестве тестового файла с множеством вложенных скобок:
Вот модификация для обработки вложенных фигурных скобок:
Объяснение:
:again;$!N;$!b again
Это то же самое, что и раньше: оно читается во всем файле.
:b
Это определяет метку
b
.s/{[^{}]*}//g
Это удаляет текст в фигурных скобках, если текст не содержит внутренних фигурных скобок.
t b
Если приведенная выше команда замены привела к изменению, вернитесь к метке
b
. Таким образом, команда замещения повторяется до тех пор, пока все группы скобок не будут удалены.источник
EDIT
), не совсем тот же самый, я думаю, что вы также должны ответить на него. Будет ли это нормально с правилами форума?Perl:
Если вы хотите редактировать на месте
Это читает файл как одну строку и выполняет глобальный поиск и замену.
Это будет обрабатывать вложенные скобки:
источник
Sed:
Начиная с строки с
{
и получая следующую строку (N
) до тех пор, пока{}
не будет произведена замена ( ) (T
означает возврат к метке, выполненной,:
если замена не сделана)Немного измените, чтобы быть правдой, если много скручивания в одной строке
Удалить все символы в скобках (
[^}]
равно каждый символ Зависитright bracket
, чтобыsed
не жадными), и если в строке остаетсяleft bracked
- назад , чтобы начать с следующей строкой добавляется , если нетright bracket
.источник