дифрагмент ^
является регулярным выражением для «начала строки», а $
является регулярным выражением для «конца строки»;поэтому sed
удалит только те строки, которые содержат в точности «EOR:» и ничего больше.
Сценарий Perl в основном perl -00 -ne '/(re)g(ex)/ && print "re ex\n"'
с большим регулярным выражением ole вместо простого заполнителя, который я здесь поместил.В частности, модификатор /x
позволяет разделить регулярное выражение на несколько строк.Таким образом, первый /
является началом регулярного выражения, а последний /
является концом регулярного выражения, а строки между ними образуют регулярное выражение.
Модификатор /s
изменяет интерпретацию Perl .
в регулярном выражении;обычно он соответствует любому символу, кроме новой строки, но с этой опцией он также включает и новые строки.Это означает, что .*
может соответствовать нескольким строкам.
\s
соответствует одному пробелу;\s+
соответствует как можно большему количеству пробельных символов, но должен быть хотя бы один.
(.*?)
соответствует произвольной длине строки;точка соответствует любому символу, звездочка указывает ноль или более любого символа, а знак вопроса изменяет оператор повторения звездочки так, чтобы соответствовать как можно более короткой строке вместо максимально длинной строки.Скобки приводят к тому, что пропущенное выражение фиксируется в обратной ссылке;обратные ссылки называются $1
, $2
и т. д., столько же, сколько существует обратных ссылок;числа соответствуют порядку открывающих скобок (поэтому, если вы примените (a(b))
к строке «ab», $1
будет «ab» и $2
будет «b»).
Наконец, \n
соответствует буквальному переводу строки.Таким образом, не жадное совпадение (.*?)
будет совпадать с первой новой строкой, то есть с хвостом строки, на которой было найдено что-то TAG.(Я полагаю, что это генные последовательности, а не «теги»?)
Нет смысла запускать sed
отдельно;Perl вполне способен удалить строки EOR:
, прежде чем пытаться найти соответствие регулярному выражению.