Eu tenho este arquivo:
'dog', 'cat', 'horse', 'turtle'
Eu quero converter a linha para:
dog
cat
horse
turtle
se eu usar apenas a vírgula como separador e o comando tr posso fazer:
tr -s ',' '\n' < file
com a saída
'dog'
'cat'
'horse'
'turtle'
Mas quando eu uso ', '
como separador, isso não funciona:
tr -s '\', \'' '\n' < file
mesmo se eu usar a barra dupla invertida para escapar das aspas simples, ainda não funciona. A única saída que recebo no terminal é >
.
Como faço para escapar corretamente as aspas simples para obter a saída desejada?
Tratando a entrada como CSV citado, com espaço em branco ignorável após cada delimitador de vírgula e usando aspas simples em vez das aspas duplas padrão como caracteres de aspas, podemos usar
csvformat
para reformatar os dados:Isso usa
csvformat
with-S
para pular os caracteres de espaço em branco iniciais após cada delimitador,-q "'"
para definir o caractere de aspas de entrada para uma aspa simples e, em seguida,-D $'\n'
para definir o delimitador de campo de saída para um caractere de nova linha.O arquivo é então reformatado.
Qualquer campo usando novas linhas incorporadas seria citado na saída, assim como o campo contendo aspas duplas incorporadas.
tr
funciona em conjuntos, não em strings. Cada primeiro símbolo do primeiro conjunto é substituído pelo primeiro símbolo do segundo conjunto, segundo símbolo do primeiro conjunto por um segundo símbolo de um segundo conjunto, etc.Se o segundo conjunto tiver menos símbolos que o primeiro - todos os símbolos do primeiro conjunto que não possuem um par adequado são substituídos pelo último símbolo do segundo conjunto.
Você precisa
Cada apóstrofo, vírgula e espaço é substituído por alimentação de linha, mas a opção -s comprime todos eles em uma instância de LF.
Com GNU
grep
ou compatível quando construído com suporte pcre:Observe que ele pula strings entre aspas vazias (como em
'empty', 'like', ''
).[\s,']
pula todos os espaços em branco, vírgulas e aspas simples, e então mantemosK
o seguinte: a próxima seqüência de não'
caracteres.Usando
sed
Você pode usar este
sed
comando:Veja também isto: http://awk.freeshell.org/PrintASingleQuote Se nos basearmos em sua referência, podemos fazer: