How to remove a newline from a string in Bash How to remove a newline from a string in Bash bash bash

How to remove a newline from a string in Bash


Under , there are some bashisms:

The tr command could be replaced by // bashism:

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

See Parameter Expansion and QUOTING in bash's man page:

man -Pless\ +/\/pattern bashman -Pless\ +/\\\'string\\\' bashman -Pless\ +/^\\\ *Parameter\\\ Exp bashman -Pless\ +/^\\\ *QUOTING bash

Further...

As asked by @AlexJordan, this will suppress all specified characters. So what if $COMMAND do contain spaces...

COMMAND=$'         \n        RE BOOT      \r           \n'echo "|$COMMAND|"|           BOOT      |CLEANED=${COMMAND//[$'\t\r\n']}echo "|$CLEANED|"|                 RE BOOT                 |shopt -q extglob || { echo "Set shell option 'extglob' on.";shopt -s extglob;}CLEANED=${CLEANED%%*( )}echo "|$CLEANED|"|                 RE BOOT|CLEANED=${CLEANED##*( )}echo "|$CLEANED|"|RE BOOT|

Shortly:

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

Note: have extglob option to be enabled (shopt -s extglob) in order to use *(...) syntax.


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

will replace the newline (in POSIX/Unix it's not a carriage return) with a space.

To be honest I would think about switching away from bash to something more sane though. Or avoiding generating this malformed data in the first place.

Hmmm, this seems like it could be a horrible security hole as well, depending on where the data is coming from.


Clean your variable by removing all the carriage returns:

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