2013-12-05 2 views
1

Я хочу, чтобы удалить строки из файла на основе строки я ищу, как это:удалить строки из файла, разбиваются на несколько строк с «»

sed -i.bak '/xyz/d' "$PATH" 

Проблема для меня являются строки, которые содержат эту строку и разбиты на несколько строк с «\», например:

this is the string im looking for xyz but there \ 
    are other lines \ 
    that are part \ 
    of that \ 
    god damn line 

есть простой способ, чтобы полностью удалить «линию» с Башем/SED/регулярным выражением?

ответ

4

Вы могли бы сказать: (. Это присоединится к строке, содержащей xyz, который разделен на несколько строк, заканчивающиеся в /, а затем удалить его)

sed -e :a -e '/.*xyz.*\\$/N; s/\\\n//; ta' -e '/xyz/d' filename 

+0

, кажется, работает :) я должен буду проверить его в различных файлах, чтобы увидеть, если он работает везде для меня. И спасибо за объяснение ;-) – cptPH

+0

Что делать, если 'xyz' не был в первой строке нескольких строк? Требует ли OP объединения всех нескольких строк? – potong

+0

@potong Учитывая пример, я предположил, что 'xyz' был на первой строке. Как всегда, ваши ответы 'sed' всегда представляют что-то для изучения. Честно. – devnull

1

Поскольку sed работает по одной линии за раз, вам нужно будет использовать команду N, чтобы присоединиться к линиям.

Это сообщение объясняет использование довольно хорошо: How the 'N' command works in sed?

3

Это может работать для вас (GNU СЭД):

sed ':a;/\\$/{N;ba};h;s/\\\n//g;/xyz/d;g' file 

Это собирает несколько строк, копирует их в пространство удержания, удаляет маркеры разделительной линии, а затем удаляет всю строку, если она содержит xyz. Если строка не содержит xyz, оригинальные разделительные линии заменяются и распечатываются.

Если предпочтительно, чтобы все несколько линий объединяются независимо, то:

sed ':a;/\\$/{N;ba};s/\s*\\\n\s*/ /g;/xyz/d' file 
Смежные вопросы