Для 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""