Если у вас есть несколько совпадений, grep -o
выдаст несколько строк вывода. И символы новой строки заканчиваются sed
командами:
$ echo abcabbcd | grep -o 'ab*'
ab
abb
$ repl=$(echo abcabcd | grep -o 'ab*')
$ sed -e "s/foo/$repl/"
sed: -e expression #1, char 8: unterminated `s' command
Кроме того, [^</title>]+
означает «один или несколько символов, которые не являются ни одним из ^
, <
, /
, t
, i
, l
, e
или >
. ]». Возможно, это не то, чего вы на самом деле хотите:
$ echo '<title>abcdefgh</title>' | grep -Po '<title>\K[^</title>]+'
abcd
Вы можете использовать эквивалент, если разделитель состоит из одного символа, например. "[^"]*"
нормально. Но здесь что-то вроде <title>\K.*?(?=</title>)'
может подойти лучше:
$ echo '<title>abcdefgh</title> <title>foobar</title>' | grep -Po '<title>\K.*?(?=</title>)'
abcdefgh
foobar
(Хотя я бы избегал таких уловок, как \K
и просмотр вперед, и вместо этого использовал более простую perl -lne 'print $1 if m,<title>(.*?)</title>,'
или пост--обработку вывода, но это мое предпочтение.)
Используйте команду чтения. Переключатель -t — ваш друг. Подобно этому
(echo "we:re:e";sleep 2;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
Выход:
we
re
(echo "we:re:e";sleep 1;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
Выход:
we
re
e d
dd