Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使sed替换文件中的文本,并在屏幕上显示替换的行_Bash_Sed - Fatal编程技术网

Bash 使sed替换文件中的文本,并在屏幕上显示替换的行

Bash 使sed替换文件中的文本,并在屏幕上显示替换的行,bash,sed,Bash,Sed,这可以很好地替换所选文件。 但我想同时看看原始文件和替换文件之间的区别 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 "&

这可以很好地替换所选文件。
但我想同时看看原始文件和替换文件之间的区别

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' -
我怎样才能做到呢?

好吧,老板

也许sed的w选项会有所帮助。这是一个开始

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//' -
还可以尝试以下操作以在差异之前/之后输出文件:

[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

您没有显示任何示例输入/输出,因此idk知道您真正想做的是什么,但是在将前/后行打印到stderr时,在文件中进行更改,这对于GNU awk而不是您正在使用的GNU sed来说是微不足道的:

$ 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
}' {} \;
当您使用awk时,您不需要grep(任何时候您使用grep+sed或多个sed或多个grep的管道时,您可能应该使用单个awk命令),因此grep命令正在执行的任何操作都可以包含在awk脚本中,您可以使用
-exec+
而不是
-print0 | xargs-0
以提高效率

使sed替换文件中的文本,并在屏幕上显示替换的行

你可以做:

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'

此处,
pattern
是要替换的文本,
Rstring
是替换字符串

您的问题似乎是关于单个文件的,那么为什么要将它与
find | xargs
混淆呢?将问题简化为基本要素。如果要查看原始文件和新文件之间的差异,最简单的方法是将新数据写入新文件并调用
diff
。尝试“就地编辑”只会让你的问题变得更加困难。威廉·珀塞尔@你是对的。但是我必须替换我域中的每个文件,所以实际上,我使用这个命令,因为如果使用“find”。William Pursell@Yes,对,不需要写入每个父路径。而且使用编辑器和diff插件也是最简单的事情,它们添加了额外的过程来工作。使用
find
xargs
调用该脚本。将您的问题简化为其基本要素将直接反映在您的解决方案中;将问题简化为其基本组成部分,并逐个解决。这是使用
sed-i
的概念问题之一;它阻止用户学习分解问题。
sed 's/pattern/Rstring/g' InputFile | tee OutputFile | sed -n '/Rstring/p'