удалять текст между разделителями несколько раз в каждой строке

#regex #bash #sed #non-greedy

#регулярное выражение #bash #sed #нежадный

Вопрос:

Мне нужно удалить текст между разделителями «<» и «>», но в каждой строке моего текстового файла их несколько экземпляров.

Например, я хочу превратить это:

 person 1, person 2<email2@mail.com>, person 3<email3@mail.com>, person 4<email4@mail.com>`
  

В это:

 person 1, person 2, person 3, person 4  
  

Я пытался использовать несколько вещей, включая sed:

sed -e 's/<.*>//' filename.csv

но это удаляет все между первым < и последним, > давая результат person 1, person 2 .

Комментарии:

1. Регулярное выражение sed 's/<.*>//g' file будет работать, но только если есть только один адрес электронной почты, потому что .* является жадным и соответствует максимально длинной строке. Однако, если вы используете sed 's/<[^>]*>//g' file вместо этого, регулярное выражение удаляет все строки, начинающиеся с < , и все остальное вплоть до следующего > .

2. Имеет смысл. Спасибо, что нашли время объяснить, что происходит.

Ответ №1:

в вашем регулярном выражении можно использовать класс отрицаемых символов:

 sed 's/<[^>]*>//g' filename.csv
  

Ответ №2:

Если вы хотите присоединиться к темной стороне, Perl позволяет вам указывать нежадные подстановочные знаки с помощью ? :

 perl -pe 's/<.*?>//g' filename.csv
  

Комментарии:

1. Это также отлично сработало! Я определенно ценю темную сторону.