@ 2010-08-20 BS一下不看manpage的自己
引用
$ man sed
...
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
...
也就是说,只需要用 sed -i 就可以直接替换文件中的内容
======以前的分割线======
要用sed批量修改文件的内容,但是用这个命令解决不了问题:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \;
因为bash把 > 解释为find命令输出的重定向。
修改一下:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \;
还是不行,因为 sed 去寻找一个名为 > 的文件进行处理
再修改:
find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \;
还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行
那是囧之又囧阿。于是去baidu,去google,
但是无论baidu还是google "find -exec 重定向"
都搜不到相应的解决方案,这样的问题居然没有人遇到过?
于是用google搜了一下
引用
linux find using "-exec" sed redirect
搜到了这一页:
http://www.loisch.de/linux.html
看来还是国人太ooxx了,sigh。
解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行
注意:下面的命令一定不要在有用的文件上直接尝试!!!!!!
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
哦也!没有错误提示了!
然后 ls -al 一下,爽!所有文件大小都变成 0 了!
为什么捏?那篇文章里面解释了:
因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。
那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案:
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
嘿,这下爽了!
欢迎扫码关注:
转载请注明出自
,如是转载文则注明原出处,谢谢:)
RSS订阅地址:
https://www.felix021.com/blog/feed.php
。
登入
注册
RSS:
日志
|
评论
编码:UTF-8
XHTML 1.0
访问次数 6276648
今日访问 791
日志数量 826
评论数量 2477
引用数量 1
留言数量 152
注册用户 433
在线人数 24