Substituir espaços por sublinhados somente quando entre aspas

1

Eu preciso substituir todos os espaços que existem entre aspas. Eu tenho várias colunas, mas apenas uma coluna citou a saída contendo espaços que está jogando fora minhas colunas ao usar column -t

"UDP netprobe"
"ACL allow"
"ACL deny"

"UDP_netprobe"
"ACL_allow"
"ACL_deny" 
    
por Steve 23.05.2018 / 14:11

5 respostas

1

Em geral, um analisador de CSV adequado seria recomendado. Nesse caso simples, o awk fará: use aspas duplas como o caractere separador de campo e:

awk -F '"' -v OFS='"' '{
    for (i=2; i<=NF; i+=2)
        gsub(/[[:blank:]]/, "_", $i)
    print
}' <<END
first "UDP netprobe" hello
second "ACL allow" friendly "oops, another quoted field"
third "ACL deny" world
END
first "UDP_netprobe" hello
second "ACL_allow" friendly "oops,_another_quoted_field"
third "ACL_deny" world

Para os fãs de uma linha:

awk -F\" '{for(i=2;i<=NF;i+=2)gsub(/[[:blank:]]/,"_",$i)}1' OFS=\" file
    
por 23.05.2018 / 14:34
4

com perl :

perl -pe 's{".*?"}{$& =~ y/ /_/r}ge' file
    
por 23.05.2018 / 15:27
1

Usando sed :

sed 's/\("[^"]\+\) \([^"]\+"\)/_/g' file

O regex procura palavra dentro do dobro e o comando substitui o espaço pelo sublinhado.

    
por 23.05.2018 / 14:38
1
sed 's/\(\"[^" ]*\) \([^"]*\"\)/_/g' file

Advertência: só funciona com um único espaço entre um par de aspas duplas.

    
por 23.05.2018 / 15:00
1

com sed

sed -E ':A;s/("[^ "]+) ([^"]*")/_/;tA' infile
    
por 23.05.2018 / 16:25