在 bash 中以编程方式解释回车 returns
Interpret carriage returns programatically in bash
当bash显示字符串时,它解释回车符return '^M'
$ echo "1234^Mab"
ab34
我有一个脚本需要访问已解释的字符串 "ab34"。但我找不到任何方法来做到这一点。 echo 命令的输出流仍然包含回车 return 字符,这意味着如果脚本读取输出,它仍然会看到“1234^Mab”,即使 shell 显示字符串 "ab34".
删除托架 return 还不够好;它不会产生字符串 "ab34".
$ echo "1234^Mab" | tr -d '\r'
1234ab
将回车 return 转换为 unix 样式的换行符也不会产生所需的结果:
$ echo "1234^Mab" | sed 's/^M/\n/'
1234
ab
这是一个脚本,"emulates" carriage-return 通过逐字符处理输入参数。输出也是逐个字符构建的,遇到 CR 时重置输出索引。
#! /bin/bash
arg=""
out=""
cr=$'\r'
j=0
for ((i=0; i<${#arg}; i++)) ; do
char=${arg:$i:1}
if [[ $char = $cr ]] ; then
j=0
else
tmp="${out:0:$j}"$char
((j++))
out="$tmp${out:$j}"
fi
# echo "$out" # to see it in progress
done
echo "Final: $out"
示例:
$ ./t.sh 123456$'\r'abcde$'\r'.:.
1
12
123
1234
12345
123456
123456
a23456
ab3456
abc456
abcd56
abcde6
abcde6
.bcde6
.:cde6
.:.de6
Final: .:.de6
使用 col -b
命令解释光标控制序列和 return 可见输出。
echo $'1234\rab' | col -b
这处理大约一打不同的光标运动序列,而不仅仅是回车 return。
当bash显示字符串时,它解释回车符return '^M'
$ echo "1234^Mab"
ab34
我有一个脚本需要访问已解释的字符串 "ab34"。但我找不到任何方法来做到这一点。 echo 命令的输出流仍然包含回车 return 字符,这意味着如果脚本读取输出,它仍然会看到“1234^Mab”,即使 shell 显示字符串 "ab34".
删除托架 return 还不够好;它不会产生字符串 "ab34".
$ echo "1234^Mab" | tr -d '\r'
1234ab
将回车 return 转换为 unix 样式的换行符也不会产生所需的结果:
$ echo "1234^Mab" | sed 's/^M/\n/'
1234
ab
这是一个脚本,"emulates" carriage-return 通过逐字符处理输入参数。输出也是逐个字符构建的,遇到 CR 时重置输出索引。
#! /bin/bash
arg=""
out=""
cr=$'\r'
j=0
for ((i=0; i<${#arg}; i++)) ; do
char=${arg:$i:1}
if [[ $char = $cr ]] ; then
j=0
else
tmp="${out:0:$j}"$char
((j++))
out="$tmp${out:$j}"
fi
# echo "$out" # to see it in progress
done
echo "Final: $out"
示例:
$ ./t.sh 123456$'\r'abcde$'\r'.:.
1
12
123
1234
12345
123456
123456
a23456
ab3456
abc456
abcd56
abcde6
abcde6
.bcde6
.:cde6
.:.de6
Final: .:.de6
使用 col -b
命令解释光标控制序列和 return 可见输出。
echo $'1234\rab' | col -b
这处理大约一打不同的光标运动序列,而不仅仅是回车 return。