#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. Это также отлично сработало! Я определенно ценю темную сторону.