Я думаю, что sed
- лучший выбор, чем awk
, но он не совсем понятен.
sed -n '/ *Test #[0-9]* */s///p' <<!
<html>
<body>
Test #1 '<%aaa(x,y)%>'
Test #2 '<%bbb(p)%>'
Test #3 '<%pqr(z)%>'
</body>
</html>
!
Вы не можете использовать grep
;он возвращает строки, которые соответствуют шаблону, но обычно не редактирует эти строки.
Вы можете использовать awk
:
awk '/Test #[0-9]+/ { print $3 }'
Шаблон соответствует тестовым линиям и печатает третье поле,Это работает, потому что после третьего номера теста нет пробелов.Если там могут быть пробелы, тогда скрипт sed
проще;он уже обрабатывает их, в то время как сценарий awk
должен быть изменен для правильной обработки.
Судя по комментариям, желаемым выводом является материал между '<%
' и '%>
».Таким образом, мы используем sed
, как и раньше:
sed -n '/.*\(<%.*%>\).*/s//\1/p'
В строках, которые соответствуют 'что-нибудь- <%
-anything- %>
-чему-либо', замените всю строку на часть между '<%
'и' %>
'(включая маркеры) и распечатайте результат.Обратите внимание, что если в строке несколько шаблонов, которые совпадают, будет напечатан только последний.(Вопрос и комментарии не охватывают, что делать в этом случае, поэтому это приемлемо. Альтернативы жесткие и лучше всего обрабатываются в Perl или, возможно, Python.)
Если одинарные кавычки в строках должны быть сохраненызатем вы можете использовать любой из них - я бы использовал первый с двойными кавычками, окружающими регулярное выражение, но они оба работают и эквивалентны.OTOH, если в регулярном выражении были выражения с $
знаками или обратными галочками, одинарные кавычки лучше;на уровне оболочки нет метасимволов внутри строки в одинарных кавычках.
sed -n "/.*\('<%.*%>'\).*/s//\1/p"
sed -n '/.*\('\''<%.*%>'\''\).*/s//\1/p'
Последовательность '\''
- это способ встраивания одинарных кавычек в строку в одинарных кавычках в сценарии оболочки.Первая кавычка завершает текущую строку;обратная косая черта генерирует одинарную кавычку, а последняя кавычка начинает новую строку в одинарных кавычках.