Подтвердить что ты не робот

Как удалить возврат каретки из строки в Bash

У меня есть следующая переменная.

echo "|$COMMAND|"

который возвращает

|
REBOOT|

Как я могу удалить этот первый возврат каретки?

4b9b3361

Ответ 1

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

заменит новую строку (в POSIX/Unix это не возврат каретки) с пробелом.

Если честно, я бы подумал о том, чтобы перейти от bash к чему-то более разумному. Или избегать генерации этих искаженных данных в первую очередь.

Хммм, похоже, это может быть ужасное отверстие безопасности, в зависимости от того, откуда поступают данные.

Ответ 2

В , есть некоторые bashisms:

Команда 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

Ответ 3

Очистите переменную, удалив все каретки:

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

Ответ 4

Использование 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|

Ответ 5

Если вы используете bash с включенной опцией extglob, вы можете удалить только пробелы с помощью:

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

Выводится:

|
RE BOOT|

Или замените %% на ##, чтобы заменить только ведущие пробелы.

Ответ 6

Что сработало для меня, было echo $testVar | tr "\n" " "

Где testVar содержит мою переменную / script -output