Для Cygwin's grep
Обходной путь заключается в том, что вы можете указать значение ASCII в Bash. "
22 в гексе.
Два момента: Вы должны удалить одинарные кавычки вокруг первой части, чтобы $'\x22'
интерпретировалось как специальное, а не как буквальное.
А для второй части выражения вы не можете просто использовать -o
, это должно быть -oE
.
Потому что +
является частью ERE
, а без -E
это просто BRE
. Это думает +
буквально.
Доказательство +
буквально там .. 55.55.55.55 не будет соответствовать, но это будет:
$ echo 3+.3+.3+.3+ | grep -o [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
3+.3+.3+.3+
Так вот линия, которую вы имели, но скорректировали ..
Использование функции Bash для расширения кодов ASCII вместо использования кавычек. Удаление кавычек из первой части и добавление -E
ко второй части:
$ grep -o ProductVersion$'\x22'.*$'\x22'.*$'\x22' foo.txt | grep -oE [0-9]+\.[0
-9]+\.[0-9]+\.[0-9]+
59.59.140.59
ADDED
Если вы замените [0-9]+
на [0-9][0-9]*
(то же самое), то вы можете использовать grep без -E
.
Вы можете использовать grep -P
а затем вы можете использовать \d
для [0-9]
, но вы должны использовать кавычки вокруг второй части. Или \\d
.
На самом деле, вот отличное решение, которое полностью решает вашу первоначальную проблему .. Вам нужна только цитата вокруг проблемного бита. (Между прочим, я мог бы сделать регулярное выражение во второй половине более эффективным, используя оператор повторения, но это не относится к проблеме, с которой мы столкнулись в кавычках, на которые я обращаю внимание).
Это работает. Удаление одиночных кавычек из первого бита и использование \"
чтобы сделать их буквальными кавычками. Это обходит ошибку двойных кавычек, нуждающихся в одинарных кавычках. (Странная ошибка, если в findstr
Windows NT есть что-то подобное, хотя, без сомнения, без одинарных кавычек.)
grep -P
во второй части позволяет нам использовать \d
. Мы могли бы поставить кавычки вокруг регулярного выражения во второй половине. Или мы можем просто поставить кавычки вокруг '\d\
или мы можем сделать то же, что и я, и использовать \\d.
(\d
отдельно - ununesped и без кавычек, не будут совпадать, потому что он интерпретируется Bash и уменьшается до d
когда grep
получает его.)
$ grep -o ProductVersion\".*\".*\" foo.txt | grep -oP \\d+\.[0-9]+\.[0-9\]+\.[0
-9]+
59.59.140.59
Теперь, когда мы решили проблему с кавычками, я сделаю ее более эффективной с помощью оператора повторения. Регулярное выражение 3{4}
означает 3333
. Регулярное выражение (fg){4}
будет означать fgfgfgfg
.
$ grep -o ProductVersion\".*\".*\" foo.txt | grep -P '(\d.){4}'
ProductVersion" Value="59.59.140.59""
$ grep -o ProductVersion\".*\".*\" foo.txt | grep -P '('\\d.')'{4}
ProductVersion" Value="59.59.140.59""
$ grep -o ProductVersion'"'.*'"'.*'"' foo.txt | grep -P '('\\d.')'{4}
ProductVersion" Value="59.59.140.59""