17

このコマンドは、古い文字列が存在する場合、古い文字列を新しい文字列に置き換えます。

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

交換が行われたかどうかを確認するにはどうすればよいですか? (または何回起こったのですか?)

4

4 に答える 4

9

置換をカウントする必要がある場合、はニーズに適しています。

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"

編集

置換の数を数えるトリックを見つけたウィリアムに感謝します(同じ行にあるかどうかにかかわらず)$count += s///g

于 2013-03-15T12:57:46.587 に答える
0

これは私のために働いた。

awk -v s="OLD" -v c="NEW" '{count+=gsub(s,c); }1
END{print count "numbers"}
' opfilename
于 2013-11-21T04:21:51.510 に答える
0

awk などの他のツールを自由に選択できる場合は (@sputnick が提案したように)、他のツールを使用してください。Awk は、パターンが一致した回数を数えることができました。

/g特にフラグを使用する場合、sed自体は置換をカウントできません。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                                               
-b-b-b-b-b-
------
x-x-x-
于 2013-03-15T13:40:56.117 に答える
0

これawkは、置換が行われた行数ではなく、置換の総数をカウントする必要があります。

awk 'END{print t, "substitutions"} {t+=gsub(old,new)}1' old="foo" new="bar" file
于 2013-03-17T19:42:04.173 に答える