基本上我想要实现类似echo -e
的反转。
我有一个存储命令输出的变量,但我想将换行符打印为\ n。
答案 0 :(得分:5)
如果您的输入已经在(bash
)shell变量中,请说$varWithNewlines
:
echo "${varWithNewlines//$'\n'/\n}"
只需使用 bash
parameter expansion 将所有换行($'\n'
)实例替换为文字'\n'
。
如果输入来自文件,请使用 awk
:
awk -v ORS='\\n' 1
在行动中,使用示例输入:
# Sample input with actual newlines created with ANSI C quoting ($'...'),
# which turns `\n` literals into actual newlines.
varWithNewlines=$'line 1\nline 2\nline 3'
# Translate newlines to '\n' literals.
# Note the use of `printf %s` to avoid adding an additional newline.
# By contrast, a here-string - <<<"$varWithNewlines" _always appends a newline_.
printf %s "$varWithNewlines" | awk -v ORS='\\n' 1
awk
逐行读取输入ORS
- 输出记录分隔符设置为文字'\n'
(使用其他\
进行转义,以便awk
不会解释它作为转义序列),输入行与该分隔符一起输出1
只是{print}
的简写,即所有输入行均已打印,由ORS
终止。注意:输出将始终以文字</ em> '\n'
,结尾,即使您的输入未以换行符结尾。
这是因为awk
使用ORS
终止每个输出行,无论输入行是否以换行符结束(FS
中指定的分隔符)。
以下是如何无条件地从输出中删除终止文字'\n'
。
# Translate newlines to '\n' literals and capture in variable.
varEncoded=$(printf %s "$varWithNewlines" | awk -v ORS='\\n' 1)
# Strip terminating '\n' literal from the variable value
# using bash parameter expansion.
echo "${varEncoded%\\n}"
相比之下,如果您希望使终止文字'\n'
的存在取决于输入是否以换行符结束,则需要做更多的工作。
# Translate newlines to '\n' literals and capture in variable.
varEncoded=$(printf %s "$varWithNewlines" | awk -v ORS='\\n' 1)
# If the input does not end with a newline, strip the terminating '\n' literal.
if [[ $varWithNewlines != *$'\n' ]]; then
# Strip terminating '\n' literal from the variable value
# using bash parameter expansion.
echo "${varEncoded%\\n}"
else
echo "$varEncoded"
fi
答案 1 :(得分:5)
这是我的解决方案:
sed 's/$/\\n/' | tr -d '\n'
答案 2 :(得分:2)
您可以使用printf "%q"
:
eol=$'\n'
printf "%q\n" "$eol"
$'\n'
答案 3 :(得分:1)
Bash解决方案
x=$'abcd\ne fg\nghi'
printf "%s\n" "$x"
abcd
e fg
ghi
y=$(IFS=$'\n'; set -f; printf '%s\\n' $x)
y=${y%??}
printf "%s\n" "$y"
abcd\ne fg\nghi