Como posso substituir todos os espaços fora de aspas duplas por \ n?

1

Eu tenho um $variable que tem muitos caminhos com aspas duplas separados por espaços

echo $variable

"/home/myuser/example of name with spaces" "/home/myuser/another example with spaces/myfile"

O número de caminhos na minha variável pode variar e não é algo sob controle. Pode, e. ser como os exemplos a seguir:

example 1: "path1" "path2" "path3" "path4"
example 2: "path1" "path2" "path3" "path4" "path5" "path6" path7" "path8"
example 3: "path1" "path2" "path3" 
example 4: "path1" "path2" "path3" "path4" "path5" "path6"

Eu quero substituir todos os espaços fora das aspas duplas por uma nova linha ( \n ), preservando os espaços que estão entre aspas. Usar echo $variable | tr " " "\n" como em esta resposta não funciona para mim porque substitui todos os espaços por novas linhas. Como posso fazer isso?

    
por Rafael Muynarsk 29.06.2018 / 02:30

1 resposta

2

Se os elementos forem sempre citados em duplicidade, você poderá substituir o quote-quote-quote pelo quote-newline-quote:

$ sed 's/" "/"\n"/g' <<< "$variable"
"/home/myuser/example of name with spaces"
"/home/myuser/another example with spaces/myfile"

ou (usando a substituição de parâmetros do shell)

$ printf '%s\n' "${variable//\" \"/\"$'\n'\"}"
"/home/myuser/example of name with spaces"
"/home/myuser/another example with spaces/myfile"

Mas seria mais simples se você pudesse modificar seu script para usar uma matriz:

$ vararray=("/home/myuser/example of name with spaces" "/home/myuser/another example with spaces/myfile")
$ printf '"%s"\n' "${vararray[@]}"
"/home/myuser/example of name with spaces"
"/home/myuser/another example with spaces/myfile"
    
por 29.06.2018 / 02:47