0

要输入 0xD (\r),我们有 ^V^M (Ctrl+V, Ctrl+M)。

当我在终端中输入 ^V^J (Ctrl+V, Ctrl+J) 时,光标只是跳到新行的开头。

^V^J (Ctrl+V, Ctrl+J) 在 AIX 中运行良好,ksh。

其实问题是:

在文本文件“foo.txt”中,内容为

aaa
bbb

在十六进制视图中:61 61 61 0D 62 62 62

我只是喜欢使用sed 's/^M/^J/g' foo.txt替换ODOA.

但结果是sed 's/^M/

/g' foo.txt`

在单独的行中。

4

2 回答 2

2

$'...'解释其中的转义码,因此您可以使用$'\n'将 \n 添加到命令行。

于 2012-05-19T00:54:07.590 回答
0

问题似乎主要在于输入如何回显到屏幕上。如果我输入echo -n ', Control-V, Control-J, ' | hexdump -C,则表明我输入了换行符。

如果我省略了 Control-V,则输出是相同的,尽管 bash 会显示>提示。在这种情况下,bash 在输入时看到了换行符,并提示继续,因为引用未终止。如果我不使用 Control-V 并且只按 Return 而不是 Control-J,则结果与仅按 Control-J 相同。

使用 Control-V 而不是引号,Control-J 被解释为换行符,但 bash 不会立即看到它。因此,键入echo foo、Control-V、Control-Jecho bar等价于键入:

echo foo
echo bar

它发出两个echo命令并打印:

foo
bar

这两行(如 bash 或 readline 所见)都分别在历史记录中。

这样想,如果你发出以下命令,你期望会发生什么?

printf "echo foo\necho bar" | sh

(请注意,printf它会在其输入中解释转义序列。)Bash 会将其输入流中的换行符解释为两个单独行之间的分隔符。好吧,当您键入 Control-V、Control-J 时,它会看到相同的内容并以相同的方式对其进行解释。

于 2012-05-19T10:00:47.103 回答