Para o grep do Cygwin
Uma solução alternativa é que você pode especificar o valor ASCII no Bash. " é 22 em hexadecimal.
Dois pontos: você precisa remover as aspas simples ao redor da primeira parte, para que $'\x22' seja interpretado como especial, não como literal.
E para a segunda parte da expressão, você não pode usar apenas -o , tem que ser -oE .
Como + faz parte de ERE e sem -E , é apenas BRE . Acha que + é literal.
Prova + é literal lá .. 55.55.55.55 não corresponde, mas isto irá:
$ echo 3+.3+.3+.3+ | grep -o [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
3+.3+.3+.3+
Então aqui está a linha que você tinha, mas ajustou ..
Usando o recurso do Bash de expandir os códigos ASCII, em vez de usar aspas. Removendo aspas da primeira parte e adicionando -E à segunda parte:
$ grep -o ProductVersion$'\x22'.*$'\x22'.*$'\x22' foo.txt | grep -oE [0-9]+\.[0
-9]+\.[0-9]+\.[0-9]+
59.59.140.59
ADICIONADO
Se você substituir [0-9]+ por [0-9][0-9]* (que é o mesmo), você poderá usar o grep sem o -E .
Você pode usar grep -P e, em seguida, usar \d para [0-9] , mas é necessário usar aspas na segunda parte. Ou \d .
Na verdade, aqui está uma ótima solução que resolve totalmente o seu problema original. Você só precisa de uma citação em torno do bit problemático. (By the way, eu poderia fazer a expressão regular no segundo semestre mais eficiente usando o operador de repetição, mas isso não é relevante para o problema que tivemos com citações que eu estou focando).
Isso funciona. Eliminando as aspas simples do primeiro bit e usando \" para torná-las cotas literais. Isso contorna o erro das aspas duplas que precisam ser citadas individualmente. (Erro estranho se o findstr do Windows NT tiver algo parecido, mas não com aspas simples, sem dúvida.)
grep -P na segunda parte, nos permite usar \d . Poderíamos colocar aspas em torno da expressão regular no segundo semestre. Ou podemos simplesmente colocar aspas em torno do '\d\ ou, podemos fazer o que eu fiz e usar \d. ( \d sozinho - unescaped e sem aspas, não corresponderá porque é interpretado pelo Bash e reduzido a d quando grep pegar.)
$ grep -o ProductVersion\".*\".*\" foo.txt | grep -oP \d+\.[0-9]+\.[0-9\]+\.[0
-9]+
59.59.140.59
Agora que lidamos com a questão das cotações, tornarei isso mais eficiente com o operador de repetição. A expressão regular de 3{4} significa 3333 . A expressão regular de (fg){4} significaria 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""