如果旧字符串存在,则此命令用新字符串替换旧字符串。
sed "s/$OLD/$NEW/g" "$source_filename" > $dest_filename
如何检查更换是否发生?(或者发生了多少次?)
如果您需要计算替换, 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
你也可以用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-
这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