it-roy-ru.com

Как удалить возврат каретки и символ новой строки из переменной в скрипте Shell

Я новичок в сценарии Shell. Я получаю файл, который создан в Windows и имеет возврат каретки с помощью команды source. После того, как я добавляю к нему несколько символов, он всегда начинается с начала строки.

test.dat (с возвратом каретки в конце):

testVar=value123

testScript.sh (исходники над файлом):

source test.dat
echo $testVar got it

Я получаю вывод

got it23

Как я могу удалить '\r' из переменной?

19
Mojoy

еще одно решение использует tr:

echo $testVar | tr -d '\r'
cat myscript | tr -d '\r'

опция -d означает delete.

40
Nik O'Lai

Вы можете использовать sed следующим образом:

MY_NEW_VAR=$(echo $testVar | sed -e 's/\r//g')
echo ${MY_NEW_VAR} got it

Кстати, попробуйте сделать dos2unix в вашем файле данных.

14
Xavier S.

используйте эту команду в файле скрипта после его копирования в Linux/Unix

Perl -pi -e 's/\r//' scriptfilename
5
Vorsprung

Передайте sed -e 's/[\r\n]//g', чтобы удалить возврат каретки (\r) и перевод строки (\n) из каждой текстовой строки.

3
mcandre

для чистого решения Shell без вызова внешней программы:

NL=$'\n'    # define a variable to reference 'newline'

testVar=${testVar%$NL}    # removes trailing 'NL' from string
1
The O.G. X

Поскольку исходный файл заканчивает строки возвратом каретки, содержимое $testVar может выглядеть следующим образом:

$ printf '%q\n' "$testVar"
$'value123\r'

($ в первой строке является приглашением оболочки; $ во второй строке взят из строки форматирования %q, указывая $'' цитирование .)

Чтобы избавиться от возврата каретки, вы можете использовать Расширение параметров оболочки и Цитирование ANSI-C (требуется Bash):

testVar=${testVar//$'\r'}

Что должно привести к

$ printf '%q\n' "$testVar"
value123
0
Benjamin W.