Используя awk
, мне нужно найти слово в файле, которое соответствует шаблону регулярного выражения.
Я только хочу , чтобы напечатать слово совпадающего с шаблоном.
Итак, если в строке у меня есть:
xxx yyy zzz
И узор:
/yyy/
Я хочу получить только:
yyy
РЕДАКТИРОВАТЬ: благодаря Куруми мне удалось написать что-то вроде этого:
awk '{
for(i=1; i<=NF; i++) {
tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
if(tmp) {
print $i
}
}
}' $1
и это то, что мне было нужно :) большое спасибо!
tmp=match($i, /regexp);if(tmp){}
, вы просто должны уметь это делать,if(tmp ~ $i){}
потому что~
означает «соответствует регулярному выражению».Ответы:
Это самый простой
попросите
awk
найтиpattern
использование//
, затем распечатайте строку, которая по умолчанию называется записью и обозначается $ 0. По крайней мере, прочтите документацию .Если вы хотите только распечатать совпадающее слово.
источник
print
как действие по умолчанию:awk '/pattern/' file
будет достаточно.for
-loop работать, если (a) «yyy» является регулярным выражением, а не прямой строкой и (b) если это «yyy» не соответствует всему полю внутри запись.$i=="yyy"
; это было бы$i ~ /yyy/
для регулярного выражения.Похоже, вы пытаетесь подражать
grep -o
поведению GNU . Это будет сделано, если вам нужно только первое совпадение в каждой строке:Вот пример использования
awk
реализации GNU (таращиться):Читайте о
match
,substr
,RSTART
иRLENGTH
вawk
ручном.После этого вы можете захотеть расширить это, чтобы иметь дело с несколькими совпадениями в одной строке.
источник
gawk может получить соответствующую часть каждой строки, используя это как действие:
источник
Если вас интересует только последняя строка ввода и вы ожидаете найти только одно совпадение (например, часть итоговой строки команды оболочки), вы также можете попробовать этот очень компактный код, заимствованный из Как печатать совпадения регулярных выражений используя awk? :
Или более сложная версия с частичным результатом:
Предупреждение:
awk
match()
функция с тремя аргументами существует только вgawk
, а не вmawk
Вот еще хорошее решение с использованием ' назад регулярное выражение в
grep
вместоawk
. Это решение предъявляет более низкие требования к вашей установке:источник
Если Perl - вариант, вы можете попробовать следующее:
Чтобы реализовать сопоставление без учета регистра, добавьте
i
модификаторЧтобы распечатать все ПОСЛЕ матча:
Чтобы распечатать совпадение и все, что после него:
источник
Использование sed также может быть элегантным в этой ситуации. Пример (заменить строку соответствующей группой «yyy» из строки):
Соответствующая страница руководства: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions
источник
sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
Не по теме, это также можно сделать с помощью grep, просто разместив его здесь, если кто-то ищет решение grep
источник
Если вы знаете, в каком столбце находится текст / шаблон, который вы ищете (например, «yyy»), вы можете просто проверить этот конкретный столбец, чтобы увидеть, соответствует ли он, и распечатать его.
Например, учитывая файл со следующим содержимым (называемый asdf.txt )
чтобы напечатать второй столбец только в том случае, если он соответствует шаблону «yyy», вы можете сделать что-то вроде этого:
Обратите внимание, что это также будет соответствовать практически любой строке, где во втором столбце есть «yyy», например:
источник