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//' -
我怎样才能实现它?
答案 0 :(得分:0)
好老板,
也许sed的w选项可以提供帮助。这是一个开始;
[root@volte1 test]# cat scr.sh
sed -i '/ligne/{
s//line/g
w /dev/stdout
}' file.txt
[root@volte1 test]# cat file.txt
line1
line2
line3
line4
ligne5
line6
line7
[root@volte1 test]# ./scr.sh
line5
[root@volte1 test]# cat file.txt
line1
line2
line3
line4
line5
line6
line7
还要尝试以下方法在差异之前/之后输出文件:
$ cat scr2.sh
find . -name file.txt -printf '\n%p:\n' -exec sed -i '/ligne/{
h
s//line/g
H
x
s/\n/ >>> /
w /dev/fd/2
x
}' {} \;
答案 1 :(得分:0)
你没有显示任何样本输入/输出所以idk你正在尝试做什么但是在文件中进行更改同时将前/后行打印到stderr将是微不足道的GNU awk而不是您正在使用的GNU:
find . -type f -name "test.php" -print0 |
xargs -0 awk -i inplace '{
print "Before:", $0 | "cat>&2"
sub(/old_regexp/,"new_string")
print "After:", $0 | "cat>&2"
} 1'
当你使用awk时你不需要grep(任何时候你使用grep + sed或多个seds或多个greps的管道你可能应该使用一个awk命令)所以无论grep命令是什么可以只包含在awk脚本中,您可以使用-exec ... +
代替-print0 | xargs -0
来提高效率。
答案 2 :(得分:0)
使sed替换文件就地文本,并在屏幕上显示替换行
你可以这样做:
sed 's/pattern/Rstring/g' InputFile | tee OutputFile | sed -n '/Rstring/p'
此处pattern
是要替换的文本,Rstring
是替换字符串。