Padrão de correspondência \\\ "usando grep

4

Eu tenho uma string json dentro do json. Isso foi codificado várias vezes e acabei com muitos recuos de escape: \\" .

A sequência muito curta parece

'[{"testId" : "12345", "message": "\\"the status is pass\\" comment \\\"this is some weird encoding\\\""}]'

Estou tentando obter o número de ocorrências do padrão \\" e não \\\"

Como posso fazer isso?

Qualquer solução shell / python está pronta. Em python, usando a string de pesquisa

search_string = r"""\\\""" , lança unexpected EOF erro.

    
por Madhavan Kumar 10.09.2015 / 13:27

1 resposta

13

Para procurar \\" em qualquer lugar em uma linha:

grep -F '\\"'

Ou seja, use -F para uma pesquisa de cadeia fixa em oposição a uma correspondência de expressão regular (em que a barra invertida é especial). E use aspas strongs ( '...' ) dentro do qual a barra invertida não é especial.

Sem -F , você precisaria dobrar as barras invertidas:

grep '\\\"'

Ou use:

grep '\\{3\}"'
grep -E '\{3}"'
grep -E '[\]{3}"'

Dentro de aspas duplas, você precisaria de outro nível de barras invertidas e também escaparia da " com barra invertida:

#              1
#     1234567890123
grep "\\\\\\\""

barra invertida é outro operador de cotação shell. Assim, você também pode citar as barras invertidas e " caracteres com barra invertida:

\g\r\e\p \\\\\\\"

Eu até mesmo citei os caracteres de grep acima, embora isso não seja necessário (como nenhum dos g , r , e , p são especiais para o shell (exceto no shell Bourne se eles aparecem em $IFS . O único caractere que eu não citei é o caractere de espaço, já que precisamos do seu significado especial no shell: argumentos separados.

Para procurar \\" , desde que não seja precedido por outra barra invertida

grep -e '^\\\"' -e '[^\]\\\"'

Ou seja, procure \\" no início da linha ou siga um caractere diferente de barra invertida.

Dessa vez, precisamos usar uma expressão regular, o que uma pesquisa de sequência fixa não fará.

grep retorna as linhas que correspondem a qualquer uma dessas expressões. Você também pode escrever com uma expressão por linha:

grep '^\\\"
[^\]\\\"'

Ou com apenas uma expressão:

grep '^\(.*[^\]\)\{0,1\}\\{3\}"' # BRE
grep -E '^(.*[^\])?\{3}"'        # ERE equivalent
grep -E '(^|[^\])\{3}"'

Com o GNU grep construído com suporte a PCRE, você pode usar uma declaração negativa com olhar para trás:

grep -P '(?<!\)\{3}"'

Obter uma contagem de correspondências

Para obter uma contagem das linhas que correspondem ao padrão (isto é, que têm uma ou mais ocorrências de \\" ), adicione a opção -c a grep . Se, no entanto, você quiser o número de ocorrências, poderá usar a opção -o específica do GNU (embora agora também suportada por algumas outras implementações) para imprimir todas as correspondências uma por linha e, em seguida, encaminhar para wc -l para obter uma linha Contagem:

grep -Po '(?<!\)\{3}"' | wc -l

Ou de forma padrão / POSIXly, use awk :

awk '{n+=gsub(/(^|[^\])\{3}"/,"")};END{print 0+n}'

( awk ' gsub() substitui e retorna o número de substituições).

    
por 10.09.2015 / 13:37