How to remove a newline from a string in Bash
Under bash, 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: bash 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.