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

时间:2013-03-15 12:54:29

标签: linux bash shell sed

如果旧字符串存在,则该命令将旧字符串替换为新字符串。

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

如何检查更换是否发生? (或者发生了多少次?)

4 个答案:

答案 0 :(得分:8)

不是正确的工具,如果您需要计算替换次数,将更符合您的需求:

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"

修改

感谢william找到了$count += s///g技巧来计算替换次数(偶数或不同一行)

答案 1 :(得分:0)

如果您可以自由选择其他工具,例如awk(如@sputnick建议的那样),请使用其他工具。 Awk可以计算模式匹配的次数。

sed本身不能计算替换,特别是如果你使用/g标志。但是如果你想坚持sed并知道更换时间,那么就有可能:

一种方法是

grep -o 'pattern'|wc -l file && sed 's/pattern/rep/g' oldfile > newfile

你也可以用 tee

来做
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-

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这对我有用。

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