Если у меня есть строка с непечатаемыми символами, новыми строками или вкладками, есть ли способ использовать echo
эту строку для печати этой строки и отображения кодов для этих символов (например, \n
для новой строки, \b
для возврата на одну позицию )?
13
e- ohce
* rimshot *printf '%q' "$str"
напечатает экранированную строку Я не добавляю это как ответ, так как это не та же самая форма побега, котораяecho -e
использует - скорее, она предназначена для безопасности eval - но (1) это достаточно хорошо, если ваша цель - читабельность человеком, (2) это достаточно хорошо, если ваша цель - безопасное создание оболочки, и (3) вecho -e
любом случае это зло и зло (если вы прочитаете спецификацию POSIX, вы увидите, что printf является предпочтительным способом форматирования строк иecho -e
не гарантируется базовой версией POSIX при все).Ответы:
Есть много способов сделать это. Самые переносимые два из известных мне -
sed
иod
оба - POSIX.Это как ...
read
стиль избегает - С-стиль.ВЫХОД
od
немного более настраиваемый ...Если вы хотите знать, что вы можете посмотреть во всех этих опциях
man od
, но я уточняю, что я хочу два типа экранирования - экранирование с-t c
обратной косой чертой и-t a
именованные символы.-w
Параметр , используемый выше, не является POSIX-указания.А вот небольшая функция оболочки, которая будет выводить восьмеричные значения каждого байта в своих аргументах, что, конечно же,
od
может работать и с-t o
:Это простой. Это немного сложнее. Он должен быть в состоянии делать то, что могут делать специфичные для оболочки
printf -q
реализации.Используя пример строки из ранее с небольшим дополнительным:
ВЫХОД
Это только немного отличается. Вы можете заметить, что есть дополнительный
0
и дополнительный\b
удар. Это позволяет легко переводить аргументыread
или%b
printf
аргументы. Например:ВЫХОД
источник
proctal
?bsq()
том, что-то не хватает? Я спрашиваю, потому что я не совсем уверен насчет обратной косой черты.Когда вы убираете
-e
переключатель вecho
, вbash
и при условии, чтоxpg_echo
опция не была включена, он должен печатать строки как не более чем их исходный текст. Так\n
и\t
появилось бы буквально так.пример
Вы также можете использовать
printf
встроенную командуksh93
,zsh
или,bash
чтобы найти это тоже.(
выдержка изbash
вывод показан выше. Существуют некоторые вариации в зависимости от оболочки).help printf
вbash
источник
printf %q
том, что они усекают концевые\n
s, а в$()
выводе, который их убирает.printf
глупо работать внутри подоболочки для захвата ее вывода, такprintf -v varname
как вывод будет помещен непосредственно в переменную, не задействуя подоболочку.printf
в подоболочке, я запустилecho
одну, только для того, чтобы продемонстрировать, что ты можешь взять вывод специального символаecho
и преобразовать его обратно в экранированную запись.Вы могли бы использовать что-то вроде,
Теперь вы можете сделать что-то вроде,
Выход
Еще одно общее тестирование без каких-либо файлов, как,
Приведенная выше команда выдает результат как
Ссылки
источник
С
zsh
, Есть(q)
,(qq)
,(qqq)
,(qqqq)
переменная флаги расширения , которые могут процитировать переменные различными способами:В вашем случае вы, вероятно, захотите один из двух последних.
источник
od -c
будет печатать обычные символы в обычном порядке, но специальные символы (табуляция, новая строка и т. д.) и непечатаемые символы в качествеprintf
кода перехода.Так:
-An
Говоритod
не выводится адрес.источник
Используйте
printf
команду. Например:printf "Hello\nthis is my line
будет выводить
источник
echo -e
, я смотрю на реверсе .