find
で置き換えられた文字列の数を計算しようとしていますsed
。
私が最初に言いたいことは次のとおりです。
# find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {} \;
これは「finddddd」の4つの出現を置き換えます。このコマンドを実行した後、コマンドが再び機能するようにテストファイルをリセットしました。
wc -l
"findddd"インスタンスを見つけて置き換えるを試してみましたが、下の行に一致する項目が0個表示されます。
# find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {} \; | wc -l
0
移動wc -l
コマンドも試しましたが、エラーが発生しました。
find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {}| wc -l;
find: missing argument to `-exec'
0
そして
find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" | wc -l {} \;
wc: {}: No such file or directory
wc: ;: No such file or directory
0 total
find: missing argument to `-exec'
基本コマンドで一致数を出力するにはどうすればよいですか?
ベストアンサー1
間違ったツールを使用しています。wc
入力行数を計算しますが、使用しているため、sed -i
印刷行がないため、計算する項目はありませんwc
。これがなくても、sed
コマンドはファイルのすべての行を印刷するため、まだ機能しません。他のアプローチは次のとおりです。
代わりにPerlを使用してください
find . -name \*.php \ -exec perl -i -lpe 's|finddddd|replaceeeee|g && print STDERR "."' {} \; \ 2>&1 | wc -l
ヒントは、
.
交換が成功するたびにを印刷してから結果をに渡すことですwc
。この-i
フラグはファイルを内部で編集し、-l
各呼び出しに改行が追加されるようにします。渡されたスクリプトを適用した後、各入力行を印刷するようにPerlにprint
指示します。ファイルをその場で編集しているため、ファイルをファイルに追加したくない場合は、STDERRで印刷する必要があります。次にSTDERRはSTDOUT()にリダイレクトされます。-p
-e
.
2>&1
wc
同じ行で複数の代替項目を個別に計算する必要がある場合は、perlを再利用してください。
find . -name \*.php -exec \ perl -i -lpe '$l++ while s|finddddd|replaceeeee|; END{print STDERR $l}' {} + 2>&1
ここでは、Perl自体が計算を実行しています。通話終了
+
の代わりに通話終了を使用しました。これは、コマンドをできるだけ少ない数のコマンドに結合しようとすることを意味します。ファイルが多すぎない場合は、すべて1回の実行で渡され、数は正確です。ファイルが多すぎると失敗するため、以下を使用する必要があります。\;
-exec
.php
perl
find . -name \*.php -exec \ perl -lpe '$l++ while s|finddddd|replaceeeee|; END{print STDERR $l}' {} + 2>&1 >/dev/null | awk '{k+=$1; }END{print k}'