【发布时间】:2018-08-21 17:08:33
【问题描述】:
find . -type f -name "test.php" -print0 | xargs -0 egrep -sHnl "&\s*new\s"| xargs gsed -i.bak 's/&\(\s*new\s\)/\1/gi' -
这可以很好地替换选定的文件。
但是我想同时看看原始文件和替换文件的区别。
find . -type f -name "test.php" -print0 | xargs -0 egrep -sHnl "&\s*new\s"| xargs gsed -i.bak 's/&\(\s*new\s\)/\1/gip' -
此尝试失败,但也重复了被替换的行。
find . -type f -name "test.php" -print0 | xargs -0 egrep -sHnl "&\s*new\s"| xargs gsed -n 's/&\(\s*new\s\)/\1/p' -
这可行,但既不会覆盖原始文件(即不会用替换的文本改变它)也不会备份。
在this 的启发下,我尝试了关注,但没有成功。
find . -type f -name "test.php" -print0 | xargs -0 egrep -sHnl "&\s*new\s"| xargs gsed -i.bak 's/&\(\s*new\s\)/\1/gip;s/.*\n//' -
我怎样才能实现它?
【问题讨论】:
-
您的问题似乎与单个文件有关,那么为什么要将事情与
find | xargs混淆?将问题简化为基本要素。 -
如果要查看原始文件和新文件之间的差异,最简单的做法是将新数据写入新文件并调用
diff。尝试进行“就地编辑”只会让您的问题变得更加困难。 -
威廉珀塞尔@你是对的。但是我必须替换我域中的每个文件,所以我使用这个命令,因为如果你使用'find',就不需要编写每个父路径。
-
William Pursell@ 是的,没错。并且使用带有 diff 插件的编辑器也是最简单的事情,尽管它们添加了额外的过程来工作。
-
编写一个简单的脚本来解决一个文件的问题。使用
find和xargs调用该脚本。将您的问题简化为基本要素会直接反映在您的解决方案中;将问题简化为基本组成部分并单独解决每个部分。这是使用sed -i的概念问题之一;它会阻止用户学习分解问题。