2014-10-24 1 views
1

Мне известно, как удалить определенные шаблоны с помощью sed.Linux: как удалить строки, начинающиеся с шаблона, на другой шаблон с помощью sed

Вот пример:

exampleFile 

One Two Three Four 
Five Six Seven 
Eight One Nine Four 

Если я применяю следующее, все «One будут удалены.

sed 's/\<One\>//g' exampleFile 

Но что, если я хочу удалить все, начиная с 1 до 4? Выход я ищу это:

Five Six Seven 
Eight 

Я думал о написании следующего, но он не работает:

sed 's/\<One*Four\>//g' exampleFile 

(я подумал, что, положив *, это должно означать, удалить все, между и включая один и четыре) ... Является ли моя просьба даже возможной в одной строке?

Спасибо!

+0

. * Необходимо. –

+0

* face-palm * Спасибо, я чувствую себя немного смущенным сейчас, потому что это было так просто. – Tim

ответ

2

В регулярных выражениях, . означает «любой символ» и * означает «любое число предыдущего элемента», так что вы могли бы сделать:

sed 's/\<One.*Four\>//g' exampleFile 

Вы можете дополнительно добавить соответствующие угловые скобки для обеспечения того, чтобы Единый и четыре должны быть отдельные слова:

sed 's/\<One\>.*\<Four\>//g' exampleFile 
1

Добавление к @that ответ другого парня, удаление пустых строк, а

sed -e 's/\<One\>.*\<Four\>//g' -e '/^$/d' exampleFile 
0

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

sed ':a;/\<One\>.*\<Four\>/{s/\<Four\>/\n/;s/\<One\>[^\n]*\n//;/^\s*$/d;ba}' file 

Это проверяет, если строки One и Four происходят на той же линии, и если да заменяет вторую строку с маркером (\n), а затем удаляет из первой строки маркер и включает маркер. Если оставшаяся строка пуста или содержит только пробел, линия удаляется, иначе процесс повторяется до тех пор, пока первое условие больше не будет применяться.

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

Смежные вопросы