Minha string de exemplo é a seguinte:
This is 02G05 a test string 20-Jul-2012
Agora, da string acima, quero extrair 02G05
. Para isso tentei o seguinte regex com sed
$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Mas o comando acima não imprime nada e a razão pela qual acredito é que ele não é capaz de corresponder nada ao padrão que forneci ao sed.
Portanto, minha pergunta é o que estou fazendo de errado aqui e como corrigi-lo.
Quando tento a string acima e o padrão com python, obtenho meu resultado
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
sed
. Seus sabores regex são bastante diferentes.Respostas:
O padrão
\d
pode não ser compatível com o seused
. Experimente[0-9]
ou em[[:digit:]]
vez disso.Para imprimir apenas a correspondência real (não toda a linha correspondente), use uma substituição.
fonte
.*
é necessário com sua regex porque quando tentosed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'
apenas imprime a linha inteira.2G05
não imprime02G05
. A expressão que funciona é's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'
seria mais geral. (Suponho que seussed
apoios\?
para zero ou uma ocorrência.)\w
,\s
, etc.Que tal usar
grep -E
?fonte
sed
script complexo poderia ser criado para esse caso, mas por que se preocupar?egrep
usa regexp estendidased
egrep
usa regexp padrão,egrep
ougrep -e
oused -E
usa regexp estendida, e o código python em questão usa PCRE (expressão regular comum de perl) GNU grep pode usar PCRE com-P
opção.egrep
ougrep -E
oused -r
grep
tem-m 1
que parar após a primeira partida.sed
não reconhece\d
, use em seu[[:digit:]]
lugar. Você também precisará escapar do+
ou usar a-r
chave (-E
no OS X).Observe que isso
[0-9]
funciona bem para algarismos árabe-hindus.fonte
sed -n '/[0-9]\+G[0-9]\+/p'
. Agora, ele apenas imprime a string inteiraEm vez disso, tente isto:
Mas observe, se houver dois padrões em uma linha, ele imprimirá o segundo.
fonte
Tente usar o rextract . Ele permitirá que você extraia o texto usando uma expressão regular e o reformate.
Exemplo:
fonte
\d
são completamente supérfluos.