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