Como colocar entre aspas se as aspas simples e duplas já estiverem sendo usadas?

4

Não me lembro dos comandos e truques exatos que uso às vezes, o que resolve grande parte do trabalho, então tento registrá-los em um arquivo para referência futura. O que eu normalmente faço é apenas colocar o comando inteiro no echo e anexá-lo ao arquivo rapidamente.

Isso sempre funcionou, mas a situação a seguir chegou pela primeira vez, onde eu não pude fazer como dito acima.

Log bem sucedido

$ echo "cat file1.txt | paste -d, - - ## Step 3 " >> ~/globalLog.txt

Ficou preso aqui

$ echo "cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt

O exemplo acima está dando um erro óbvio, pois as aspas não estão sendo fechadas corretamente (caindo para o segundo comando propmt ( PS2 eu acho?) para completar o comando ie >_ no meu caso), o single ( Aspas ' ) estão sendo usadas pelo comando sed e aspas duplas ( " ) estão sendo usadas em uma expressão sed para substituição.

Como eu incluiria o comando completo em tal situação?

    
por mtk 24.10.2012 / 16:02

5 respostas

10

Você pode evitar totalmente a necessidade de citar usando os documentos aqui. Observe que definir o rótulo entre aspas simples / duplas (como em "EOF" no exemplo abaixo) desativa a avaliação de variáveis e comandos no texto.

cat <<"EOF" >>~/globalLog.txt
cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2
EOF
    
por 24.10.2012 / 16:49
5

Você tem muitas opções e cada uma delas pode ser conveniente em diferentes situações.

  1. Duplique a string inteira como uma, e escape das aspas duplas dentro (fácil de ler se você tiver apenas uma ocorrência, mas você pode acabar com um cerca de piquete ):

    echo "cat file2.txt  | sed 's/\"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  2. Use aspas diferentes para as diferentes partes da string:

    echo "cat file2.txt  | sed 's/"'"'"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  3. Use a capacidade de echo de processar vários argumentos. Isso é aplicável se apenas uma única palavra contiver o caractere ofensivo, uma vez que o resultado normalmente terá um espaço entre cada argumento, portanto, não funcionará para sua string. Exemplo alternativo:

    echo 'foo"' "'bar"
    

    imprime

    foo" 'bar
    
  4. Use várias declarações echo -n (ou printf %s ) seguidas por echo sem -n :

    echo -n "cat file2.txt  | sed '" >> ~/globalLog.txt
    echo -n 's/"' >> ~/globalLog.txt
    echo "//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  5. Não use aspas, mas escape de todos os caracteres especiais:

    echo cat\ file2.txt\ \ \|\ sed\ \'s/\"//g\'\ \>\ file3.txt\ \#\#\ Step\ 2\  >> ~/globalLog.txt
    

Note que não é possível escapar de aspas simples em uma única string entre aspas .

Em caso de dúvida, Use More Quotes ™ .

No seu caso, no entanto, parece que você está registrando um comando antes de executá-lo. Já existe uma solução muito boa para trabalhar com comandos como texto .

    
por 24.10.2012 / 16:39
3

Existe uma maneira simples, sistemática e compatível com POSIX para citar qualquer string. Você só precisa lembrar de duas regras:

  1. Cite apóstrofos (aspas simples) com uma barra invertida assim: \'
  2. Cite tudo o que não seja apóstrofos cercando-o com apóstrofes da seguinte forma: 'printf "foo\n"'

Para ilustrar como usar essas regras juntas, a palavra don't pode ser sistematicamente citada assim: 'don'\''t'

Você pode frequentemente encontrar uma maneira mais legível de citar cadeias de caracteres, mas quando as coisas ficam complicadas, essa é a maneira confiável de obter as citações desejadas.

A forma citada da string na pergunta é:

$ echo 'cat file2.txt  | sed '\''s/"//g'\'' > file3.txt ## Step 2 ' >> ~/globalLog.txt
    
por 24.10.2012 / 20:40
2

apenas escape do " da seguinte forma:

echo "cat file2.txt  | sed 's/\"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
por 24.10.2012 / 16:08
1

Apenas

$ cat >> ~/globalLog.txt
<now type your command>
echo "cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2 "
<hit ctrl-d>
    
por 24.10.2012 / 21:17