Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
Linux 如何检查sed命令是否替换了某些字符串?_Linux_Bash_Shell_Sed_Awk_Perl - Fatal编程技术网

Linux 如何检查sed命令是否替换了某些字符串?

Linux 如何检查sed命令是否替换了某些字符串?,linux,bash,shell,sed,awk,perl,Linux,Bash,Shell,Sed,Awk,Perl,此命令将旧字符串替换为新字符串(如果存在) sed "s/$OLD/$NEW/g" "$source_filename" > $dest_filename 如何检查是否进行了更换?(或者发生了多少次?不是正确的工具,如果您需要计算替代,将更适合您的需要: awk -v OLD=foo -v NEW=bar ' ($0 ~ OLD) {gsub(OLD, NEW); count++}1 END{print count " substitutions occured."} '

此命令将旧字符串替换为新字符串(如果存在)

sed "s/$OLD/$NEW/g" "$source_filename" > $dest_filename
如何检查是否进行了更换?(或者发生了多少次?

不是正确的工具,如果您需要计算替代,将更适合您的需要:

awk -v OLD=foo -v NEW=bar '
    ($0 ~ OLD) {gsub(OLD, NEW); count++}1
    END{print count " substitutions occured."}
' "$source_filename"
此最新解决方案仅统计替换的行数。下一个代码段将统计所有替换。此选项的优点是比
awk
更清晰,我们保留了
sed
替换的语法:

OLD=foo NEW=bar perl -pe '
    $count += s/$ENV{OLD}/$ENV{NEW}/g;
    END{print "$count substitutions occured.\n"}
' "$source_filename"
编辑
多亏了谁发现了计算替换数(即使不在同一行)的
$count+=s///g
技巧如果您可以自由选择其他工具,如awk(如@sputnick建议的),请使用其他工具。Awk可以计算模式匹配的次数

sed本身不能计算替换,特别是当您使用
/g
标志时。但是,如果您想坚持使用
sed
并了解更换时间,则有可能:

一种方法是

grep -o 'pattern'|wc -l file && sed 's/pattern/rep/g' oldfile > newfile
你也可以用球座

cat file|tee >(grep -o 'pattern'|wc -l)|(sed 's/pattern/replace/g' >newfile) 
看看这个小例子:

kent$  cat file
abababababa
aaaaaa
xaxaxa

kent$  cat file|tee >(grep -o 'a'|wc -l)|(sed 's/a/-/g' >newfile)
15

kent$  cat newfile                                               
-b-b-b-b-b-
------
x-x-x-

awk
应计算替换的总数,而不是发生替换的行数:

awk 'END{print t, "substitutions"} {t+=gsub(old,new)}1' old="foo" new="bar" file
这对我有用

awk -v s="OLD" -v c="NEW" '{count+=gsub(s,c); }1
END{print count "numbers"}
' opfilename

你试过这个吗?当我在我的文件上运行此命令时,它会在控制台中打印整个文件,我只想计算默认情况下“foo”被“bar”
sed
print to STDOUT(终端)替换的次数。如果不想打印,请删除编号
1
,但替换、不打印和重定向到新文件是没有意义的!我认为OP还说明了发生了多少次。不仅仅是因为有多少行,还有多少替换。awk和perl只回答被替换行的计数(在5.10中测试)相应地进行了后期编辑william,Thanksee
diff$source\u filename$dest\u filename
如果在你的问题中加入一个简短的段落,甚至一两句话作为解释,将大大有助于让这个问题成为一个很好的答案。