在bash中以编程方式解释回车

在bash中以编程方式解释回车,bash,carriage-return,Bash,Carriage Return,当bash显示字符串时,它解释回车“^M” $ echo "1234^Mab" ab34 我有一个脚本需要访问解释字符串“ab34”。但是我找不到任何方法来做这件事。echo命令的输出流仍然包含回车字符,这意味着如果脚本读取输出,它仍然会看到“1234^Mab”,即使shell显示字符串“ab34” 移除回车符不够好;它不会导致字符串“ab34” 将回车转换为unix样式的换行符也不会产生所需的结果: $ echo "1234^Mab" | sed 's/^M/\n/' 1234 ab 下面

当bash显示字符串时,它解释回车“^M”

$ echo "1234^Mab"
ab34
我有一个脚本需要访问解释字符串“ab34”。但是我找不到任何方法来做这件事。echo命令的输出流仍然包含回车字符,这意味着如果脚本读取输出,它仍然会看到“1234^Mab”,即使shell显示字符串“ab34”

移除回车符不够好;它不会导致字符串“ab34”

将回车转换为unix样式的换行符也不会产生所需的结果:

$ echo "1234^Mab" | sed 's/^M/\n/'
1234
ab
下面是一个通过逐个字符处理输入参数来“模拟”回车的脚本。输出也是逐字符构建的,在遇到CR时重置输出索引

#! /bin/bash

arg="$1"
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"
下面是一个通过逐个字符处理输入参数来“模拟”回车的脚本。输出也是逐字符构建的,在遇到CR时重置输出索引

#! /bin/bash

arg="$1"
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"
使用该命令解释光标控制序列并返回可见输出

echo $'1234\rab' | col -b
这将处理十几个不同的光标运动序列,而不仅仅是回车。

使用该命令解释光标控制序列并返回可见的输出

echo $'1234\rab' | col -b

这将处理十几个不同的光标运动序列,而不仅仅是回车。

字符串根本不“解释”;在终端将光标重新定位到行首之前,在前两个字符上方打印最后两个字符之前,您的眼睛根本不够快,无法在屏幕上看到字符串1234。一个更高级的终端甚至可能不会删除前两个,而是为您提供了一个打印样式重叠的
A/1
b/2
@karakfa,这与
var=$'1234\rab'
完全相同。回车仍然在捕获的输出流中;只有终端显示的方式使它看起来像是“ab34”。您可以通过查看扩展名
${var}
来验证这一点,以重申清楚。字符串
ab34
的唯一位置是在显示的屏幕上。唯一的原因是,
^M
/
\r
将输出光标移回行首,然后继续打印(并重写)
12
。这是终端工作原理的一个特点。这与字符串本身无关,字符串根本没有被“解释”;在终端将光标重新定位到行首之前,在前两个字符上方打印最后两个字符之前,您的眼睛根本不够快,无法在屏幕上看到字符串1234。一个更高级的终端甚至可能不会删除前两个,而是为您提供了一个打印样式重叠的
A/1
b/2
@karakfa,这与
var=$'1234\rab'
完全相同。回车仍然在捕获的输出流中;只有终端显示的方式使它看起来像是“ab34”。您可以通过查看扩展名
${var}
来验证这一点,以重申清楚。字符串
ab34
的唯一位置是在显示的屏幕上。唯一的原因是,
^M
/
\r
将输出光标移回行首,然后继续打印(并重写)
12
。这是终端工作原理的一个特点。这与字符串本身无关。现在我想起来了,可能有一个更有效的解决方案,在
\r
上拆分字符串,并在此基础上重建,而不是逐字符重建…我正在研究这个问题,但当我看到Barmar的答案时放弃了。哇,确实,更优雅了。我从来没有听说过
col
。现在我想起来了,可能有一个更有效的解决方案,在
\r
上拆分字符串并在此基础上重建,而不是一个字符一个字符地重建…我正在研究这个问题,但当我看到Barmar的答案时放弃了。哇,确实,更优雅了。从未听说过
col
。是的,这很管用<代码>变量=$(echo-e“1234\rab”| col-b);echo${#var}打印4。是的,这很有效<代码>变量=$(echo-e“1234\rab”| col-b);echo${#var}打印4。