在Windows上使用sed附加到每行的末尾?

时间:2013-11-15 20:40:56

标签: windows unix sed

我在Windows上使用sed(GNU端口)。

我执行:

$> sed "s/$/./" < /data.txt

得到:

.ne
.wo
.hree

但是期待。

one.
two.
three.

以下作品虽然我认为不应该。我读它的方式是“用句号替换该行的最后一个字符”。我担心在其他地方使用它时不会始终如一。目的不是用句号替换最后一个字符,而是附加句号。

$> sed "s/.$/./" < /data.txt

我不确定文件编码或Windows特有的内容是否导致了我遇到的问题,或者是否只是缺乏sed的经验。想法?

1 个答案:

答案 0 :(得分:2)

hexdump -C揭示了一些亮点:

$ sed 's/$/./' < t.dos | hexdump -C
00000000  6f 6e 65 0d 2e 0a 74 77  6f 0d 2e 0a 74 68 72 65  |one...two...thre|
00000010  65 0d 2e 0a                                       |e...|
00000014

在那里,2e是点,0d之前是回车又名\r,之后是换行符\n。换句话说,sed\r视为行的末尾而不是\r\n,因此\r仍然是行的一部分,因此它将点放在后面它,然后照常添加换行符。

我认为这可以做你想要的,但它并不完全漂亮:

$ sed 's/.$/.\r/' < t.dos | hexdump -C
00000000  6f 6e 65 2e 0d 0a 74 77  6f 2e 0d 0a 74 68 72 65  |one...two...thre|
00000010  65 2e 0d 0a                                       |e...|
00000014

以上情况不太好,因为它仅在输入为dos格式时才有效,否则会破坏文件。一个更好的解决方案可能是首先剥离任何\r并稍后手动添加它们,如下所示:

$ tr -d '\r' < t.dos | sed -e 's/$/.\r/' | hexdump -C
00000000  6f 6e 65 2e 0d 0a 74 77  6f 2e 0d 0a 74 68 72 65  |one...two...thre|
00000010  65 2e 0d 0a                                       |e...|
00000014