Precisa seduzir saída awk ou grep para extrair strings

3

Eu tenho uma saída que se parece com isso:

"vancouver/news/vancouver-voices": {
    "status": 0,
    "time": 0,
    "timestamp": 1371298701
},
"vancouver/news/vancouvers-march-second-annual-success": {
    "status": 0,
    "time": 0,
    "timestamp": 1371298701
}

Eu preciso extrair apenas as URLs parciais ( vancouver/news/vancouvers-march-second-annual-success and vancouver/news/vancouver-voices , por exemplo)

Basicamente estou chamando um comando via bash e, em seguida, canalizando-o para grep awk ou sed

Se eu usar grep ( | grep -o '".*": {' ), posso me aproximar. Eu acabo com a saída como:

"vancouver/news/vancouver-voices": {
"vancouver/news/vancouvers-march-second-annual-success": {

Eu suspeito que eu preciso usar sed ou awk embora. Eu tentei várias coisas, mas acho que preciso escapar de alguns dos caracteres especiais. Por exemplo, eu tentei | awk '\"(.*)\": {' --output='$1 'mas ele vomitou por causa das barras invertidas.

Qualquer sed ou awk guru pode me explicar como eu escapei dos personagens especiais?

    
por Brad 15.06.2013 / 14:26

3 respostas

2
awk '/{/ {print $2}' FS='"'

Resultado

vancouver/news/vancouver-voices
vancouver/news/vancouvers-march-second-annual-success

No entanto, isso seria melhor feito usando jq

    
por 15.06.2013 / 14:34
1

Solução com sed :

sed -n '/{/s="\([^"]*\)".*==p'

grep + cut :

grep '{' | cut -d'"' -f2
    
por 15.06.2013 / 14:42
0

Você ainda pode usar o grep:

| grep -o '[^"/]\+\(/[^"/]\+\)\+'

rendimentos:

vancouver/news/vancouver-voices
vancouver/news/vancouvers-march-second-annual-success

Ele procura por uma sequência inicial de não-", não-/ caracteres, seguida por uma ou mais sequências consistindo de uma barra seguida pelo mesmo tipo de sequência que a inicial. Também é possível usar um caractere alfanumérico mais classe de caracteres para selecionar os componentes da URL.

    
por 15.06.2013 / 18:38