LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3753|回复: 13

请教用sed删除替换文件中某行的语句的重定向

[复制链接]
发表于 2003-10-9 14:20:25 | 显示全部楼层 |阅读模式
  1. sed "/\/LCD\/LCDdaemon/d" /etc/rc.d/rc.local | sed "/\/tmp\/LCDstatus\.tmp/d" >/etc/rc.d/rc.local
复制代码

(以上代码是在一个脚本中写的,不是在命令行执行的)这一语句的意思是删除/etc/rc.d/rc.local文件中的含有/LCD/LCDdaemon和/tmp/LCDstatus.tmp的语句行,并且将结果回写至/etc/rc.d/rc.local文件。
结果也是正确的,达到目的。

而如下语句却不能有正确结果,不知道为什么?
  1. sed '/main/d' test.ccc > test.ccc
复制代码

这一语句的意思是想表达删除test.ccc中含有main的语句行,并且回写结果。但是得到的test.ccc文件却是空文件,不知道为什么。

这两个语句的不同在于第一个语句多一个管道操作。

请指点一下哪里有问题,如何做才能得到正确结果?
发表于 2003-10-9 14:35:58 | 显示全部楼层
  1. sed '/main/d' test.ccc >tmp$$;rm test.cc;mv tmp$$ test.cc
复制代码
 楼主| 发表于 2003-10-9 14:47:37 | 显示全部楼层
谢谢你给出的方法。
PS:能讲讲第二个语句为什么不能得出正确结果吗?
发表于 2003-10-9 14:57:58 | 显示全部楼层
"如果文件已经存在,并已经使用了>把输出重定向存入此文件,则此文件的当前内容将全部丢失,覆盖了文件的所有数据,此现象叫做clobbering了一个文件"
  1. sed '/main/d' test.ccc > test.ccc
复制代码
此操作看上去是合理的,但是当shell在执行sed...等命令前识别了">",因此test.ccc的内容就先被清空成零字节,....
发表于 2003-10-9 15:04:05 | 显示全部楼层
当然,如果不是同一个文件就无所谓的啦~~,因为>本身就是建立零字节文件嘛~~
 楼主| 发表于 2003-10-9 17:04:40 | 显示全部楼层
为什么对于相同的如下语句:
sed '/main/d' test.ccc | sed '/include/d' | sed '/print/d' > test.ccc
在命令行中执行得到的test.ccc文件长度为0,
而如果写在shell 脚本中,例如
#!/bin/sh
sed '/main/d' test.ccc | sed '/include/d' | sed '/print/d' > test.ccc
那么再执行的话结果就是正确的呢?
想不通,能解释一下吗?谢谢。

而且,如果在shell脚本中写如下这一句:
sed '/main/d' test.ccc > test.ccc 得到的test.ccc的文件长度也是0
只要有一个管道,例如
sed '/main/d' test.ccc | sed '/include/d' > test.ccc
结果就是期望的了,非零。
但是相同的语句写在命令行却都不能通过,结果全为0.
 楼主| 发表于 2003-10-9 17:09:42 | 显示全部楼层
最初由 javalee 发表

  1. sed '/main/d' test.ccc >tmp$$;rm test.cc;mv tmp$$ test.cc
复制代码


感觉如下语句更好一些,
  1. sed '/main/d' test.ccc > tmp$$ ; cat tmp$$ > test.ccc ; rm -f tmp$$ ;
复制代码

这样test.ccc能够保持原来的权限,如果是一个脚本,则有可执行权限,而一般建立的文件是不具备执行权限的,会造成权限丢失。
发表于 2004-1-9 11:51:47 | 显示全部楼层

你的问题斑竹已经给你指出来了阿,加一个管道后
sed "command" file.name | sed "command" > file.name
第二个sed的输入是管道,不会晴空那个文件的。

如果不加
sed "command" file.name > file.name
文件file.name就会被事先晴空,然后再送给sed命令。
发表于 2004-1-9 11:59:09 | 显示全部楼层
问题的关键大概在对〉这个符号的解释的顺序,也许command和script地解释顺序不同把,呵呵。
发表于 2010-10-16 23:13:41 | 显示全部楼层

柳暗花明又一村,呵呵

原来在命令行中右尖括号的优先级高于管道啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表