2013-08-24 3 views
1

У меня есть файл, как в следующем формате:Linux оболочки, получить все матчи из файла

line one 
line two <% word1 %> text <% word2 %> 
line three <%word3%> 

Я хочу использовать инструменты Linux оболочки, как AWK, СЭД и т.д., чтобы получить все слова, процитированные в <% %>
результат должен быть как

word1 
word2 
word3 

Спасибо за помощь.

Я забыл упомянуть: я во встроенной среде. Grep не имеет опцию -P

ответ

2

Использование AWK:

awk -F '<% *| *%>' '{for(i=2; i<=NF; i+=2) print $i}' file 
word1 
word2 
word3 
2

Вы могли бы сделать это с Grep:

$ grep -oP '(?<=<%).+?(?=%>)' file 
word1 
word2 
word3 
+0

Спасибо! Забудьте отметить, что я во встроенной среде. grep не имеет опции -P – alzhao

2

Это работает для образца:

sed -ne 's/%>/&\n/p' | sed -ne 's/.*<%\s*\(.*\)\s*%>.*/\1/p' < sample.txt 

Первый sed просто помещает разрыв строки после каждого закрытия %>, как подготовка.

Следующий sed извлекает соответствующую часть в пределах <% ... %> без ведущих и конечных пробелов.

В обеих командах флаг -n, объединенный с s///p, должен ограничивать данные, проходящие через трубу только на соответствующие (соответствующие) линии.

+0

Спасибо. Это работает отлично. – alzhao

+0

Просто имейте в виду, что в приведенном выше примере есть две не переносимые конструкторы sed: a) использование '\ n' в качестве новой строки (обратная косая черта, сопровождаемая литеральным возвратом каретки, переносима) и b) использование' \ s' для представления пробела character ('[[: blank:]]' is POSIX, но в этом случае буквальный пустой символ, вероятно, является адекватным). Я удивлен, что ваш sed работает с теми, когда ваш grep не поддерживает '-P'. –

4

С GNU AWK, поэтому мы можем RS до нескольких символов:

$ gawk -v RS='<% *| *%>' '!(NR%2)' file 
word1 
word2 
word3 

С любой современной AWK:

$ awk -F'<% *| *%>' '{for (i=2;i<=NF;i+=2) print $i}' file 
word1 
word2 
word3 
+1

Это довольно красиво! – janos

+1

Это очень приятно! – alzhao

0

Это может работать для вас (GNU sed):

sed '/<%\s*/!d;s//\n/;s/[^\n]*\n//;s/\s*%>/\n/;P;D' file 
Смежные вопросы