如何检查sed命令是否replace了一些string?

这个命令用旧的stringreplace旧的string(如果存在的话)。

sed "s/$OLD/$NEW/g" "$source_filename" > $dest_filename 

我如何检查replace是否发生? (或者发生了多less次?)

Solutions Collecting From Web of "如何检查sed命令是否replace了一些string?"

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

 awk -v OLD=foo -v NEW=bar ' ($0 ~ OLD) {gsub(OLD, NEW); count++}1 END{print count " substitutions occured."} ' "$source_filename" 

这个最新的解决方案只计算被替换的行数。 下一个片段用perl计算所有的替换。 这个比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 -bbbbb- ------ xxx- 

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

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

这对我工作。

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