为什么sed删除最后一行?

时间:2010-03-03 16:40:45

标签: unix sed

$ cat file.txt
one
two
three
$ cat file.txt | sed "s/one/1/"
1
two

“三”这个词在哪里?

更新: “三”字后面没有任何一行。

6 个答案:

答案 0 :(得分:4)

正如Ivan建议的那样,你的文本文件缺少最后一行的行尾(EOL)标记。由于不存在,three由sed打印出来,然后立即被提示覆盖。如果您强制打印额外的行,则可以看到它。

sed 's/one/1/' file.txt && echo

这是一个常见的问题,因为人们错误地认为EOL表示存在以下行(这就是为什么它通常被称为“换行符”)并且不表示当前行已经结束。

答案 1 :(得分:2)

使用其他帖子的评论:

    如果没有EOL或“新行”,
  1. 旧版本的sed不会处理文件的最后一行。
  2. echo可用于添加新行
  3. 然后,要解决问题,您可以重新命令命令:

    ( cat file.txt && echo ) | sed 's/one/1/'
    

答案 2 :(得分:1)

我猜最后一行后面没有新行字符sed在最后一行后找不到行分隔符并忽略它。

<强>更新

我建议你在perl中重写它(如果你安装了它):

cat file.txt | perl -pe 's/one/1/'

答案 3 :(得分:1)

谷歌搜索显示某些版本的sed(不是GNU或BSD版本,其工作正如您所期望的)的手册页表明它不会处理不完整的行(不是换行终止的行)在文件的末尾。解决方案是确保您的文件以换行符结束,安装GNU sed或使用awk或perl。

答案 4 :(得分:0)

在替换字符串之后运行带有文件名作为参数的sed,而不是将文件和管道连接到sed,如下所示:

sed "s/one/1/" file.txt

当我这样做时,我立即得到了“三个”提示符:

1
two
three$

答案 5 :(得分:0)

这是一个awk解决方案

awk '{gsub("one","1")}1' file.txt