У меня есть следующая переменная.
echo "|$COMMAND|"
который возвращает
|
REBOOT|
Как я могу удалить этот первый возврат каретки?
У меня есть следующая переменная.
echo "|$COMMAND|"
который возвращает
|
REBOOT|
Как я могу удалить этот первый возврат каретки?
echo "|$COMMAND|"|tr '\n' ' '
заменит новую строку (в POSIX/Unix это не возврат каретки) с пробелом.
Если честно, я бы подумал о том, чтобы перейти от bash к чему-то более разумному. Или избегать генерации этих искаженных данных в первую очередь.
Хммм, похоже, это может быть ужасное отверстие безопасности, в зависимости от того, откуда поступают данные.
Команда tr
может быть заменена на //
bashism:
COMMAND=$'\nREBOOT\r \n'
echo "|${COMMAND}|"
|
OOT
|
echo "|${COMMAND//[$'\t\r\n']}|"
|REBOOT |
echo "|${COMMAND//[$'\t\r\n ']}|"
|REBOOT|
См. раздел "Расширение параметров" на странице bash:
man -Pless\ +/\/pattern bash
Как попросил @AlexJordan, это будет подавлять все указанные символы. Итак, что, если $COMMAND
содержат пробелы...
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|
Коротко:
COMMAND=$' \n RE BOOT \r \n'
CLEANED=${COMMAND//[$'\t\r\n']} && CLEANED=${CLEANED%%*( )}
echo "|${CLEANED##*( )}|"
|RE BOOT|
Примечание. Возможно использовать shopt -s extglob
для использования синтаксиса *(...)
.
См. раздел "Расширение параметров" на странице bash:
man -Pless\ +/Parameter.Expansion bash
Очистите переменную, удалив все каретки:
COMMAND=$(echo $COMMAND|tr -d '\n')
Использование bash
:
echo "|${COMMAND/$'\n'}|"
(Обратите внимание, что контрольный символ в этом вопросе является "новой строкой" (\n
), а не возвратом каретки (\r
), последний имеет выход REBOOT|
в одной строке.)
Использует Bash Расширение параметров оболочки ${parameter/pattern/string}
:
Шаблон расширяется, чтобы создать шаблон так же, как при расширении имени файла. Параметр расширяется, и самое длинное совпадение шаблона с его значением заменяется на строку. [...] Если строка имеет значение null, совпадения шаблона удаляются, и шаблон /follow может быть опущен.
Также использует конструкцию $''
ANSI-C quoting, чтобы указать новую строку как $'\n'
. Использование новой строки напрямую будет работать, хотя и менее симпатично:
echo "|${COMMAND/
}|"
#!/bin/bash
COMMAND="$'\n'REBOOT"
echo "|${COMMAND/$'\n'}|"
# Outputs |REBOOT|
Или, используя символы новой строки:
#!/bin/bash
COMMAND="
REBOOT"
echo "|${COMMAND/
}|"
# Outputs |REBOOT|
Если вы используете bash с включенной опцией extglob, вы можете удалить только пробелы с помощью:
shopt -s extglob
COMMAND=$'\nRE BOOT\r \n'
echo "|${COMMAND%%*([$'\t\r\n '])}|"
Выводится:
|
RE BOOT|
Или замените %% на ##, чтобы заменить только ведущие пробелы.
Что сработало для меня, было echo $testVar | tr "\n" " "
Где testVar содержит мою переменную / script -output