如何检查是否sed命令替换了一些字符串? [重复](How to check if the se

2019-08-17 14:55发布

这个问题已经在这里有一个答案:

  • 如何检查是否sed的改变了文件 6个回答

此命令替换旧的字符串,如果存在一个新的。

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

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

Answer 1:

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招计算取代数目(甚至是否在同一行)



Answer 2:

如果它是免费供您选择其他工具,比如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-


Answer 3:

awk应该算替代,而不是替代地方发生的行数的总数:

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


Answer 4:

这为我工作。

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


文章来源: How to check if the sed command replaced some string? [duplicate]