Como remover uma nova linha de uma string no Bash

Eu tenho a seguinte variável.

echo "|$COMMAND|" 

que retorna

 | REBOOT| 

Como posso remover essa primeira nova linha?

 echo "|$COMMAND|"|tr '\n' ' ' 

irá replace a nova linha (em POSIX / Unix não é um retorno de carro) com um espaço.

Para ser honesto, eu pensaria em mudar de bash para algo mais sensato. Ou evitar gerar esses dados malformados em primeiro lugar.

Hmmm, isso parece ser um buraco de segurança horrível também, dependendo de onde os dados estão vindo.

Sob bash , existem alguns bashisms:

O comando tr pode ser substituído por // bashism :

 COMMAND=$'\nREBOOT\r \n' echo "|${COMMAND}|" | OOT | echo "|${COMMAND//[$'\t\r\n']}|" |REBOOT | echo "|${COMMAND//[$'\t\r\n ']}|" |REBOOT| 

Veja Expansão de parameters na página man do bash:

 man -Pless\ +/\/pattern bash 

Mais distante…

Conforme solicitado pelo @AlexJordan, isso suprimirá todos os caracteres especificados. Então, e se $COMMAND contiver espaços …

 COMMAND=$' \n RE BOOT \r \n' echo "|$COMMAND|" | BOOT | CLEANED=${COMMAND//[$'\t\r\n']} echo "|$CLEANED|" | RE BOOT | CLEANED=${CLEANED%%*( )} echo "|$CLEANED|" | RE BOOT| CLEANED=${CLEANED##*( )} echo "|$CLEANED|" |RE BOOT| 

Em breve:

 COMMAND=$' \n RE BOOT \r \n' CLEANED=${COMMAND//[$'\t\r\n']} && CLEANED=${CLEANED%%*( )} echo "|${CLEANED##*( )}|" |RE BOOT| 

Nota: Você pode ter que usar shopt -s extglob para usar a syntax *(...) .

Veja Expansão de parameters na página man do bash:

 man -Pless\ +/Parameter.Expansion bash 

Limpe sua variável removendo todos os retornos de carro:

 COMMAND=$(echo $COMMAND|tr -d '\n') 

Usando o bash :

 echo "|${COMMAND/$'\n'}|" 

(Observe que o caractere de controle nesta pergunta é uma ‘nova linha’ ( \n ), não um retorno de carro ( \r ); o último teria saída REBOOT| em uma única linha.)

Explicação

Usa a Expansão do Parâmetro do Bash Shell ${parameter/pattern/string} :

O padrão é expandido para produzir um padrão, assim como na expansão de nome de arquivo. O parâmetro é expandido e a correspondência mais longa do padrão com seu valor é substituída por string . […] Se string for null, as correspondências de padrão serão excluídas e o padrão / following poderá ser omitido.

Também usa a construção de citação $'' ANSI-C para especificar uma nova linha como $'\n' . Usando uma nova linha diretamente funcionaria também, embora menos bonita:

 echo "|${COMMAND/ }|" 

Exemplo completo

 #!/bin/bash COMMAND="$'\n'REBOOT" echo "|${COMMAND/$'\n'}|" # Outputs |REBOOT| 

Ou, usando novas linhas:

 #!/bin/bash COMMAND=" REBOOT" echo "|${COMMAND/ }|" # Outputs |REBOOT| 

Se você estiver usando o bash com a opção extglob ativada, você pode remover apenas o espaço em branco final por meio de:

 shopt -s extglob COMMAND=$'\nRE BOOT\r \n' echo "|${COMMAND%%*([$'\t\r\n '])}|" 

Isso gera:

 | RE BOOT| 

Ou substitua %% por ## para replace apenas o espaço em branco inicial.

O que funcionou para mim foi echo $testVar | tr "\n" " " echo $testVar | tr "\n" " "

Onde testVar continha minha variável / saída de script

Você pode simplesmente usar echo -n "|$COMMAND|" .