Как напечатать слово после регулярного выражения, но не похожее слово?

Я хочу, чтобы команда 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 ответа

Решение

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

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

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

awk -F= '$1=="Icon" {print $2}' "$file" >> /tmp/text.txt

Это может быть полезно, даже если 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 состояние.
  • $' напечатает часть строки после регулярного выражения.

Все, что тебе нужно:

sed -n 's/^Icon=//p' file
Другие вопросы по тегам