变量 v 有 \n 和,嗯,另一种类型的换行符?
v='ab\n cd
ef
'
printf '%b' "$v"
ab
cd
ef
printf '%s' "$v"
ab\n cd
ef
printf '%s' "$v" | xxd
00000000: 6162 5c6e 2063 640a 2065 660a ab\n cd. ef.
printf '%b' "$v" | xxd
00000000: 6162 0a20 6364 0a20 6566 0a ab. cd. ef.
printf '%b' 将两个换行符显示为 ASCII 10 字符。
我的函数删除了两种类型的换行符,但它对每种类型使用不同的过程。
remove() {
local str="$1" chr='\\n\\t\\r' idx
for (( idx=0; idx<${#chr}; idx+=$((${#chr} / 3)) )); do
str="${str//${chr:${idx}:3}}"
done
str=${str//[$'\n\t\r']}
printf "${str}"
}
有没有更好的方法来仅使用 Bash 通过单个进程来处理这两个问题?
我正在使用 GNU bash 4.4.19。
答案1
实际上并没有两种类型的换行符;\n
只是一个字符序列,直到您将其传递给printf '%b'
或其他一些命令(例如echo -e
将其解释为反斜杠转义序列)。
因此,您可以使用printf '%b'
将任何序列转换\n
为换行符,然后使用参数替换和 bash 删除所有换行符C 弦:
v='ab\n cd
ef
'
printf -v w '%b' "$v"; printf '%s\n' "${w//$'\n'}"
ab cd ef
答案2
您可以简单地使用 echo 。如果没有 -e 和 ",echo 将 \n 视为字符串,您可以使用参数替换将其删除。
echo ${v//\\n}