Grep для выкройки - PullRequest
0 голосов
/ 23 июня 2011

У меня есть HTML-файл со следующим кодом

<html>
  <body>
    Test #1 '<%aaa(x,y)%>'
    Test #2 '<%bbb(p)%>'
    Test #3 '<%pqr(z)%>'
  </body>
</html>

Пожалуйста, помогите мне с регулярным выражением для команды (grep или awk), которая отображает вывод следующим образом:

'<%aaa(x,y)%>'
'<%bbb(p)%>'
'<%pqr(z)%>'

Ответы [ 3 ]

1 голос
/ 23 июня 2011

Я думаю, что 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'

Последовательность '\'' - это способ встраивания одинарных кавычек в строку в одинарных кавычках в сценарии оболочки.Первая кавычка завершает текущую строку;обратная косая черта генерирует одинарную кавычку, а последняя кавычка начинает новую строку в одинарных кавычках.

0 голосов
/ 23 июня 2011
grep -P "^Test" 1.htm |awk '{print $3}'
0 голосов
/ 23 июня 2011

опция -o для grep - это то, что вам нужно:

grep -o "'.*'" filename

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