как удалить строки, связанные со знаком «+» с помощью sed - PullRequest
0 голосов
/ 26 августа 2018

В этом примере знак «+» означает, что он соединяет предыдущую и текущую строки. Поэтому я люблю удалять определенную группу линий, которые связаны "+". Например, я хотел бы удалить из 1-й строки в 4-ю строку (.groupA ~ + G H I). Пожалуйста, помогите мне, как это сделать с помощью sed.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

ИМХО, это легче сделать с awk, но, пожалуйста, просто игнорируйте, если это не вариант для вас.

Итак, каждый раз, когда я вижу строку, начинающуюся с .groupA, я устанавливаю флаг d, чтобы сказать, что я удаляю, и затем перехожу к следующей строке. Если я вижу строку, начинающуюся с +, и в настоящее время я удаляю ее, я перехожу к следующей строке. Если я вижу что-то еще, я изменяю флаг, чтобы сказать, что я больше не удаляю, и печатаю строку:

awk '/^\.groupA/  {d=1; next}
     /^+/ && d==1 {next} 
                  {d=0; print}' file

Пример вывода

** Example **
abcdef ghijkl
.groupB abc def
+ JKL
+ MNO
+ GHI
opqrst vwxyz

Вы можете разыграть его как однострочник вот так:

awk '/^\.groupA/{d=1; next} d==1 && /^+/ {next} {d=0;print}' file
0 голосов
/ 26 августа 2018

Чтобы удалить строки, начинающиеся с .groupA и все последовательные + строки с префиксом, есть один простой для понимания подход:

sed '/\.groupA/,/^[^+]/ { /\.groupA/d; /\.groupA/!{/^\+/d} }' file

Сначала мы выбираем все между .groupA и первой строкой без префикса + (включительно), затем для этого выбора строк удаляем первую строку (содержащую .groupA) и оставшиеся строки, удаляем все с префиксом +.

Обратите внимание, что вам нужно экранировать метасимволы регулярных выражений (например, . и +), если вы хотите сопоставить их буквально.


Немного более продвинутый, но более элегантный подход (только одно использование шаблона начального блока) использует цикл для пропуска первой строки соответствующего блока и всех последующих строк, начинающихся с +

sed -n '/\.groupA/ { :a; n; s/^\+//; ta }; p' file
...