Как заменить строку "\ n" новой строкой в ​​скрипте Unix Bash - PullRequest
0 голосов
/ 28 августа 2018

Не могу найти ответ на этот вопрос онлайн ...

У меня есть строковая переменная (из внешних источников) с новыми строками "\n", закодированные как строки.

Я хочу заменить эти строки на фактические возвраты каретки новой строки. Код ниже может достичь этого ...

echo $EXT_DESCR | sed 's/\\n/\n/g'

Но когда я пытаюсь сохранить результат этого в своей собственной переменной, он преобразует их обратно в строки

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`

Как этого добиться или что я делаю не так?

Вот мой код, который я тестировал, чтобы попытаться получить правильные результаты

EXT_DESCR="This is a text\nWith a new line"
echo $EXT_DESCR | sed 's/\\n/\n/g'

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`
echo ""
echo "$NEW_DESCR"

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Другие ответы содержат альтернативные решения. (Мне особенно нравится расширение параметра один.)

Вот что не так с вашей попыткой:

В

echo $EXT_DESCR | sed 's/\\n/\n/g'

команда sed указана в одинарных кавычках, поэтому sed получает s/\\n/\n/g как есть.

В

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`

вся команда указана в обратных кавычках, поэтому применяется раунд обработки обратной косой черты. Это приводит к тому, что sed получает код s/\n/\n/g, который ничего не делает.

Возможное исправление для этого кода:

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\\\n/\\n/g'`

Удвоив обратную косую черту, мы получаем правильную команду в sed.

или (проще):

NEW_DESCR=$(echo $EXT_DESCR | sed 's/\\n/\n/g')

Вместо обратных галочек используйте $( ), у которого меньше эзотерических правил побега.

Примечание: не используйте ALL_UPPERCASE для переменных оболочки. UPPERCASE (неофициально) зарезервировано для системных переменных, таких как HOME, и специальных встроенных переменных, таких как IFS или RANDOM.

0 голосов
/ 28 августа 2018

Нет необходимости в sed, используя расширение параметра :

$ foo='1\n2\n3'; echo "${foo//'\n'/$'\n'}"  
1
2
3

С bash 4.4 или новее, вы можете использовать оператор E в ${parameter@operator}:

$ foo='1\n2\n3'; echo "${foo@E}"
1
2
3
0 голосов
/ 28 августа 2018

Это printf выполнит работу, интерпретируя все экранированные конструкции:

printf -v NEW_DESCR "%b" "$EXT_DESCR"
Опция

-v будет сохранять выходные данные в переменной, поэтому здесь нет необходимости использовать подстановку команд.

Проблема с вашим подходом - использование старых обратных тиков. Вы могли бы сделать:

NEW_DESCR=$(echo "$EXT_DESCR" | sed 's/\\n/\n/g')

Предполагается, что вы используете gnu sed, поскольку BSD sed не будет работать с этим подходом.

0 голосов
/ 28 августа 2018

В зависимости от того, что именно вам нужно:

echo -e $EXT_DESCR

может быть все, что вам нужно.

со страницы руководства echo:

-e включить интерпретацию обратной косой черты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...