Завершить конвейер, если данные не передаются в течение n секунд

Если у вас есть несколько совпадений, 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>,'или пост--обработку вывода, но это мое предпочтение.)

0
21.10.2021, 14:13
1 ответ

Используйте команду чтения. Переключатель -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
0
21.10.2021, 15:46

Теги

Похожие вопросы