我在Windows上使用sed
(GNU端口)。
我执行:
$> sed "s/$/./" < /data.txt
得到:
.ne
.wo
.hree
但是期待。
one.
two.
three.
以下作品虽然我认为不应该。我读它的方式是“用句号替换该行的最后一个字符”。我担心在其他地方使用它时不会始终如一。目的不是用句号替换最后一个字符,而是附加句号。
$> sed "s/.$/./" < /data.txt
我不确定文件编码或Windows特有的内容是否导致了我遇到的问题,或者是否只是缺乏sed
的经验。想法?
答案 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