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""