Просто egrep -o 'https?: // [^ ")] +'
, который будет включать url ()
и "http"
Правила для одинарных кавычек отличаются от двойных.
По причине, которую вы показываете, двойные кавычки нельзя надежно использовать в bash, потому что нет разумного способа избежать восклицательного знака.
$ grep -oP "\\(.*(?!word).*right"
bash: !word: event not found
$ grep -oP "\\(.*(?\!word).*right"
grep: unrecognized character after (? or (?-
Вторая причина в том, что bash проходит через \!
, а не !
в grep. Отображение этого:
$ printf '%s' "\!"
\!
Когда вы пробовали использовать одинарные кавычки, двойная обратная косая черта не означает экранированную обратную косую черту, это означает две обратные косые черты.
$ printf '%s' '\\(.*(?!word).*right'
\\(.*(?!word).*right
Внутри одинарных кавычек все является буквальным, и нет никаких экранирований, поэтому способ написать регулярное выражение, которое вы пытаетесь, выглядит следующим образом:
$ grep -oP '\(.*(?!word).*right'
Если вы хотите найти соответствие от вторых открытых скобок до (но не включая) следующих закрывающих скобок:
grep -Po '\(.*?\K\([^)]*'
Или переносимо с sed
:
sed -n 's/^[^(]*([^(]*\(([^)]*\).*/\1/p'
Для соответствия самому правому (
, за которым не следует слово
до самого правого правого
] после этого:
grep -Po '.*\K\((?!word).*right'
Вместо этого ищите парные запятые перед и после:
grep -oP '(?<=,)\(.*(?=\),)'
$ echo '(foo),(bar,baz(word,right),(end)' | grep -oP '(?<=,)\(.*(?=\),)'
(bar,baz(word,right
Упреждающий и последующий поиск может искать только явные строки, он не может найти такие вещи, как . *
.
Вы можете сделать это с помощью простого awk
:
$ echo '(foo),(bar,baz(word,right),(end)' | awk -F'),' '{print $2}'
(bar,baz(word,right
Если по какой-то причине вы не можете использовать одинарные кавычки, как предложено в ответе Микеля, вы можете временно отключить расширение истории с помощью set +H
(включите его снова с помощью set -H
), как предложил Гленн Джекман в комментариях.