Използвайте tac
, за да отпечатате файла в обратната посока и след това grep -m1
, за да отпечатате само един резултат. Погледът назад и погледът напред проверява текст между <tag>
и </tag>
.
tac a | grep -m1 -oP '(?<=tag>).*(?=</tag>)'
Тест
Предвид този файл
$ cat a
<tag> and </tag>
aaa <tag> and <b> other things </tag>
adsaad <tag>and last one</tag>
$ tac a | grep -m1 -oP '(?<=tag>).*(?=</tag>)'
and last one
Актуализация
РЕДАКТИРАНЕ: Параметрите за търсене и се съдържат на различни редове с около 100 реда съдържание, които ги разделят. Съдържанието е това, което преследвам...
Тогава е малко по-сложно:
tac file | awk '/<\/tag>/ {p=1; split($0, a, "</tag>"); $0=a[1]};
/<tag>/ {p=0; split($0, a, "<tag>"); $0=a[2]; print; exit};
p' | tac
Идеята е да обърнете файла и да използвате флаг p
, за да проверите дали <tag>
вече се е появил или не. Ще започне да се печата, когато се появи </tag>
и ще приключи, когато се появи <tag>
(защото четем обратното).
split($0, a, "</tag>"); $0=a[1];
получава данните преди </tag>
split($0, a, "<tag>" ); $0=a[2];
получава данните след <tag>
Тест
Даден файл a
като този:
<tag> and </tag>
aaa <tag> and <b> other thing
come here
and here </tag>
some text<tag>tag is starting here
blabla
and ends here</tag>
Резултатът ще бъде:
$ tac a | awk '/<\/tag>/ {p=1; split($0, a, "</tag>"); $0=a[1]}; /<tag>/ {p=0; split($0, a, "<tag>"); $0=a[2]; print; exit}; p' | tac
tag is starting here
blabla
and ends here
person
fedorqui 'SO stop harming'
schedule
30.10.2013