Не очень элегантно - и есть проблемы из-за жадного сопоставления - но это более или менее работает:
data="abcdefADDNAME25abcdefgHELLOabcdefgADDNAME25abcdefgHELLOabcdefg"
for word in $data \
"ADDNAME25abcdefgHELLOabcdefgADDNAME25abcdefgHELLOabcdefg" \
"ADDNAME25abcdefgHELLOabcdefgADDNAME25abcdefgHELLO"
do
echo $word
done |
sed -e '/ADDNAME[0-9][0-9][a-z]*HELLO/{
s/\(ADDNAME[0-9][0-9][a-z]*HELLO\)/ \1 /g
}' |
while read line
do
set -- $line
for arg in "$@"
do echo $arg
done
done |
grep "ADDNAME[0-9][0-9][a-z]*HELLO"
Первый цикл отображает три строки данных - вы, вероятно, замените это на cat
или перенаправление ввода / вывода.Сценарий sed
использует модифицированное регулярное выражение для размещения пробелов вокруг шаблонов.Последний цикл разбивает слова, разделенные пробелом, на одно слово в строке.Последняя строка grep
выбирает нужные вам строки.
Регулярное выражение изменяется с [a-z]*
вместо исходного .*
, поскольку сопоставление с образцом является жадным.Если данные между ADDNAME и HELLO не ограничены, вам следует подумать об использовании не жадных регулярных выражений, которые доступны в Perl и, возможно, Python и других современных языках сценариев:
#!/bin/perl -w
while (<>)
{
while (/(ADDNAME\d\d.*?HELLO)/g)
{
print "$1\n";
}
}
Это хорошая демонстрацияиспользования права тоже для работы.