substituição de comando - cat file inserts quotes

0

No bash, dados estes arquivos:

$ cat noquotes.txt
s/a/b/g
$ cat quotes.txt
"s/a/b/g"

Por que

$ echo "aaa" | sed -e $(cat noquotes.txt)
bbb

bem-sucedido, mas

$ echo "aaa" | sed -e $(cat quotes.txt)
sed: 1: ""s/a/b/g"
": invalid command code "

falha?

Se se executar set -x primeiro, então vejo que

$ echo "aaa" | sed -e $(cat noquotes.txt)
+ echo aaa
++ cat noquotes.txt
+ sed -e s/a/b/g
bbb

e

$ echo "aaa" | sed -e $(cat quotes.txt)
+ echo aaa
++ cat quotes.txt
+ sed -e '"s/a/b/g"'
sed: 1: ""s/a/b/g"
": invalid command code "

Portanto, parece que há cotações extras sendo inseridas em torno do conteúdo de noquotes.txt , mas não em torno de quotes.txt .

    
por mark 03.05.2016 / 21:55

1 resposta

1

So it seems like there are extra quotes being inserted around the contents of noquotes.txt, but not around quotes.txt.

Isto é apenas Bash sendo útil. Você notará que vai colocar aspas em torno das coisas sempre que houver um símbolo que, de outra forma, seria interpretado pelo Bash. Ele age exatamente como você faria, usando citações apenas quando necessário. Tente colocar qualquer um dos seguintes em quotes.txt:

s/a$/a/g
s/"hi"/"bye"/g

A lista continua e continua.

Agora, voltemos à sua pergunta original. Primeiro de tudo, o seu sed imprime uma mensagem estranha. A partir de set -x , é óbvio que a entrada é "s/a/b/g" , não ""s/a/b/g" . Eu não confiaria nessa mensagem. Aqui está o que o GNU sed 4.2.1 imprime para "s/a/b/g" :

$ sed -e '"s/a/b/g"'
sed: -e expression #1, char 1: unknown command: '"'

Bastante claro: como o primeiro caracter é um nome de comando e não existe um comando chamado " , sed não tem ideia do que fazer.

    
por 03.05.2016 / 22:46