Как напечатать слово после регулярного выражения, но не похожее слово? - PullRequest
2 голосов
/ 09 сентября 2010

Я хочу, чтобы команда awk или sed выводила слово после регулярного выражения.

Я хочу найти СЛОВО после СЛОВА, но не СЛОВО, которое выглядит похожим.

Файл выглядит так:

 somethingsomething
 X-Windows-Icon=xournal
 somethingsomething
 Icon=xournal
 somethingsomething
 somethingsomething 

Я хочу "xournal" от того, который говорит "Icon = xournal". Вот как далеко я дошел до сих пор. Я тоже пробовал строку AWK, но она также оказалась неудачной.

cat "${file}" | grep 'Icon=' | sed 's/.*Icon=//' >> /tmp/text.txt

Но я получаю и то и другое, поэтому в текстовом файле есть два xournal, которые мне не нужны.

Ответы [ 3 ]

4 голосов
/ 09 сентября 2010

Используйте ^, чтобы закрепить шаблон в начале строки.И вы даже можете выполнять поиск непосредственно в sed:

sed -n '/^Icon=/ { s/.*=//; p; }' "$file" >> /tmp/text.txt

Вы также можете использовать awk, который, я думаю, читается немного лучше.Используя = в качестве разделителя полей, если поле 1 равно Icon, то выведите поле 2:

awk -F= '$1=="Icon" {print $2}' "$file" >> /tmp/text.txt
0 голосов
/ 06 ноября 2012

Все, что вам нужно, это:

sed -n 's/^Icon=//p' file
0 голосов
/ 09 сентября 2010

Это может быть полезно, даже если Perl не является одним из тегов. В случае, если вы заинтересованы в Perl, эта небольшая программа выполнит задачу за вас:

#!/usr/bin/perl -w

while(<>)
{
    if(/Icon\=/i)
    {
        print $';
    }
}

Это вывод:

C:\Documents and Settings\Administrator>io.pl new2.txt
xournal
xournal

Объяснение:

  • while (<>) принимает входные данные из файла, заданного в качестве аргумента в командной строке при выполнении.
  • (/Icon\=/i) - это регулярное выражение, используемое в условии if.
  • $' напечатает часть строки после регулярного выражения.
...