удалить текст в несколько строк между первой парой символов - PullRequest
2 голосов
/ 18 апреля 2020

Есть много похожих вопросов по SO, но я не могу найти пример, похожий на мой. Вот пример файла:

>ABCD 
blah bla
blah bla
blah bla
>123
blah bla
blah bla
>456
blah bla

Я хочу удалить текст между первой парой>. В идеале также удаляя первый>. Мой текст занимает несколько строк, хотя. Поэтому мой результат должен быть:

>123
blah bla
blah bla
>456
blah bla

Я пробовал несколько выражений sed. Например: sed '/>/,/>/{//p;d;}' file > new, но это удаляет текст между всеми остальными>. Я хочу удалить текст между первой парой>, включая первую. Из другого поста я попробовал sed '/^>/,/^\>/{/^>/!{/^\>/!d;};}' file > new, но он удаляет строки между всеми> и оставляет текст после самого первого>, который я также хочу удалить.

Помощь действительно приветствуется.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020
$ awk '!c && /^>/{f=1; c=1; next} /^>/{f=0} !f' ip.txt 
>123
blah bla
blah bla
>456
blah bla
  • !c && /^>/, если c имеет значение Falsey (которое изначально) и строка начинается с >
    • , установите флаги f и c (так, это условие никогда не будет выполнено после первого совпадения)
    • next, чтобы другие операторы были пропущены
  • /^>/{f=0} очистить флаг, если другая строка начинается с >
  • !f печатать строки, только если флаг не установлен


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

perl -0777 -pe 's/>[^>]+//' ip.txt

, при этом весь ввод вводится в виде одной строки, так что вы можете сопоставлять строки

Это возможно и с GNU sed (при условии, что ввод не имеет NUL-символ):

sed -zE 's/>[^>]+//' ip.txt
1 голос
/ 18 апреля 2020

sed лучше всего подходит для s / old / new для отдельных строк, вот и все. Для чего-то большего вы должны использовать awk:

$ awk '/^>/{c++} c>1' file
>123
blah bla
blah bla
>456
blah bla
0 голосов
/ 18 апреля 2020

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

sed -n '/^>/{:a;n;//!ba;:b;p;n;bb};p' file

Отключить неявную печать -n.

При представлении строки, начинающейся >, выбросить все последующие строки до начала новой строки >.

Распечатать эту строку и все последующие строки до конца файла.

NB Все строки до первого начала > также будут напечатаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...