Как сопоставить новые строки в awk? - PullRequest
3 голосов
/ 21 марта 2012

Входной файл text.txt:

foo()
{
}

buz()
{
}

Awk script.awk:

BEGIN {
    RS = "\n\n+";
    FS = "\n";
}
/[a-z]+\(\)\n/ {print "FUNCTION: " $1;}
{print "NOT FOUND: " $0;}

Запуск скрипта:

awk -f script.awk text.txt

дает:

NOT FOUND: foo()
{
}
NOT FOUND: buz()
{
}

Но я ожидал сопоставить обе функции с символами новой строки. Как это сделать?

Ответы [ 4 ]

4 голосов
/ 21 марта 2012

Поскольку вы уже используете "\ n" в качестве FS, вы можете просто выполнить сопоставление с $ 1:

awk -v RS='\n\n+' -v FS='\n' '
  $1 ~ /^[a-z]+\(\)$/ {print "FUNCTION: " $1; next}
  {print "NOT FOUND: " $0}
' text.txt

Это работает с gawk:

FUNCTION: foo()
FUNCTION: buz()
3 голосов
/ 21 марта 2012

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

awk '{if(/^[a-z]+\(\)\n/)print "FUNCTION:"$1; else print "NOT FOUND: "$0}' RS="" file
2 голосов
/ 21 марта 2012

Вы можете попробовать это:

BEGIN {
    RS = "";
    FS = "\n";
}
/[a-z]+\(\)/ {print "FUNCTION: " $1;}
!/[a-z]+\(\)/ {print "NOT FOUND: " $0;}

Если вы хотите убедиться, что после () ничего нет, вы можете сделать это:

$ 1 ~ / [az] + ()$ / {print "FUNCTION:" $ 1;}

Я не знаю, почему перевод строки не совпадает.Может быть, кто-нибудь объяснит это.

0 голосов
/ 02 октября 2014

Не уверен, какой вывод вы ожидаете точно.

Чтобы обработать FS в awk, вам нужно ввести пустую команду, такую ​​как $ 1 = $ 1.Без этого никакой поданный анализ не выполняется.

Так что, если вы ожидаете результат, подобный этому:

foo() { }
buz() { } 

Просто введите:

awk  '{$1=$1; print} '  RS='\n\n' FS='\n' OFS=" "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...