Событие bash не найдено, попытка сопоставить и исключить круглые скобки в grep

Просто egrep -o 'https?: // [^ ")] +'

, который будет включать url () и "http"

6
23.05.2017, 14:33
5 ответов

Правила для одинарных кавычек отличаются от двойных.

По причине, которую вы показываете, двойные кавычки нельзя надежно использовать в 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'
7
29.04.2021, 00:41

Если вы хотите найти соответствие от вторых открытых скобок до (но не включая) следующих закрывающих скобок:

grep -Po '\(.*?\K\([^)]*'

Или переносимо с sed :

sed -n 's/^[^(]*([^(]*\(([^)]*\).*/\1/p'

Для соответствия самому правому (, за которым не следует слово до самого правого правого ] после этого:

grep -Po '.*\K\((?!word).*right'
3
29.04.2021, 00:41

Вместо этого ищите парные запятые перед и после:

grep -oP '(?<=,)\(.*(?=\),)'

Пример

$ echo '(foo),(bar,baz(word,right),(end)' | grep -oP '(?<=,)\(.*(?=\),)'
(bar,baz(word,right

Упреждающий и последующий поиск может искать только явные строки, он не может найти такие вещи, как . * .

Ссылки

0
29.04.2021, 00:41

Вы можете сделать это с помощью простого awk:

$ echo '(foo),(bar,baz(word,right),(end)' | awk -F'),' '{print $2}'
(bar,baz(word,right
2
29.04.2021, 00:41

Если по какой-то причине вы не можете использовать одинарные кавычки, как предложено в ответе Микеля, вы можете временно отключить расширение истории с помощью set +H (включите его снова с помощью set -H), как предложил Гленн Джекман в комментариях.

0
29.04.2021, 00:41

Теги

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