在 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。