这个问题已经在这里有一个答案:
- 如何检查是否sed的改变了文件 6个回答
此命令替换旧的字符串,如果存在一个新的。
sed "s/$OLD/$NEW/g" "$source_filename" > $dest_filename
我如何检查是否更换发生了什么? (或多少次了?)
这个问题已经在这里有一个答案:
此命令替换旧的字符串,如果存在一个新的。
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
你也可以用T恤做
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