Показать стандартный вывод, содержащий \n, с разрывами строк.

Вы можете использовать trдля удаления пробелов и новых строк, например:

openssl rand 16 | tr -d '\n '  > file.txt

Или, если вы действительно плохо запоминаете флаги, вы можете использовать tr, чтобы преобразовать новые строки в пробелы, а затем использовать sed, чтобы удалить пробелы.

openssl rand 16 | tr '\n' ' ' | sed 's/ //g' > file.txt
5
11.08.2019, 13:15
3 ответа

%sне интерпретирует управляющие последовательности. Вам нужно %bдля этого:

% echo 'tCL\n1523 memo\n' | xargs -0 printf "%b"
tCL
1523 memo

%
5
27.01.2020, 20:33

Вот что нужно, чтобы делать с awk то, что вы хотите. Учитывая этот ввод:

$ printf '%s\n' 'abc\\ndef\nghi'
abc\\ndef\nghi

Обратите внимание, что первый \nсам экранирован и поэтому должен рассматриваться буквально как \\n. Вот как получить ожидаемый результат:

$ printf '%s\n' 'abc\\ndef\nghi' |
    awk '{gsub(/@/,"@A"); gsub(/\\\\/,"@B"); gsub(/\\n/,"\n"); gsub(/@B/,"\\\\"); gsub(/@A/,"@")}1'
abc\\ndef
ghi

Если вы хотите интерпретировать и другие управляющие последовательности, например. \t, вы должны добавить отдельный gsub ()для каждого из них сразу после одного для \n, например.:

awk '{
    gsub(/@/,"@A"); gsub(/\\\\/,"@B")
    gsub(/\\n/,"\n")
    gsub(/\\t/,"\t")
    gsub(/@B/,"\\\\"); gsub(/@A/,"@")
}1'

Эти первые 2 и последние 2 gsub ()создают уникальную строку @B, сопоставляют \\пары с ней, чтобы убрать их с пути, а затем сопоставляют их обратно после выполнения предполагаемых преобразований.

3
27.01.2020, 20:33

Достаточно просто:echo -e "tCL\n1523 memo\n"

Изman echo:

-e enable interpretation of backslash escapes

0
27.01.2020, 20:33

Теги

Похожие вопросы