Filtra a segunda ocorrência de texto entre aspas com sed? [duplicado]

0

Eu tenho uma saída grep de um arquivo assim:

"name" "Andrew Spokes"

Eu quero extrair o nome canalizando a saída do grep através de sed .

Meu resultado esperado seria: Andrew Spokes

Exijo que todo o espaço em branco que não esteja entre as aspas seja removido também.

    
por James Heald 07.09.2018 / 04:35

2 respostas

1

Um caminho seria:

... |sed -r 's/^"[^"]*" *"([^"]*)"$//'
Andrew Spokes

outro com:

sed -r 's/(([^"]*"){3})//; s/"//'

ou:

sed -r 's/.*"(.*)"$//'

Este [^"] corresponde a qualquer caractere único que não seja " .

    
por 07.09.2018 / 05:54
0

A expressão a seguir funciona para o GNU sed:

sed -E 's/^"name"[[:space:]]*"([^"]+)"$//'

Isso funciona criando uma expressão regular que corresponda à linha inteira, bem como correspondendo a uma subexpressão na qual a parte do nome desejada é encontrada. Esta é a seção entre parênteses, que é uma seqüência de caracteres que não são aspas duplas. Todo o regex correspondido é substituído pela subexpressão, referenciada como no final da expressão.

Como um exemplo de como isso funciona:

$ # Generate lines in the expected format
$ echo $'"name"   "Andrew Spokes"\n"name" "ABC"\n"name"    "Foo Bar Baz"'
"name"   "Andrew Spokes"
"name" "ABC"
"name"    "Foo Bar Baz"

$ # Pipe the same lines to the sed command
$ echo $'"name"   "Andrew Spokes"\n"name" "ABC"\n"name"    "Foo Bar Baz"' | sed -E 's/^"name"[[:space:]]*"([^"]+)"$//'
Andrew Spokes
ABC
Foo Bar Baz

Se a sua experiência com as expressões regulares do GNU é limitada, pode ajudar a procurar as construções usadas no regex acima, no Manual do GNU sed . Se usar um sabor diferente de sed, os detalhes podem ser ligeiramente diferentes. Um texto explicativo é a opção -E , isso permite expressões regulares "estendidas". No GNU sed isso tem caracteres especiais, como parênteses e barras invertidas, assumindo o significado de criar subexpressões e referências de volta sem fugir delas. Outro é o uso de ^ e $ para exigir que o regex completo coincida no início e no final da linha.

A outra chamada é simplesmente que a expressão sed usada faz suposições sobre a uniformidade de todas as linhas de entrada. Ajustes serão necessários se houver mais variação na entrada.

    
por 07.09.2018 / 06:24