-2
for i in `find `pwd` -name .htaccess -exec grep -q "RedirectMatch" {} \; -print`; do $i | sed -i 's/RedirectMatch/#RedirectMatch/g'; done

したがって、ほとんどの場合、コマンドはすべての .htaccess ファイルを検索し、「RedirectMatch」を含むファイルを grep する必要があります。それが完了したら、sed にパイプして行をコメントアウトする必要があります。

ランニング

find `pwd` -name .htaccess -exec grep -q "RedirectMatch" {} \; -print

実際には、「RedirectMatch」を含む .htaccess ファイルのリストが表示されますが、ループで実行すると、.htaccess という名前ではないファイルも含めて、ファイルの膨大なリストがスローされます。

何か案は?すべての助けに感謝します。

4

3 に答える 3

2

これは、バッククォートが原因です。コマンドは実際に実行されfindpwd文字列を追加してから、残りを実行しようとします。

使用$(...):

for i in $(find $(pwd) -name .htaccess -exec grep -q "RedirectMatch" {} \; -print); do sed -i 's/RedirectMatch/#RedirectMatch/g' $i; done

デフォルトfindでは、指定されていない場合はデフォルトで現在のディレクトリを検索するため、さらに指定できます。

for i in $(find -name .htaccess -exec grep -q "RedirectMatch" {} \; -print); do sed -i 's/RedirectMatch/#RedirectMatch/g' $i; done

(編集: sed コマンドの呼び出しも修正されました)

于 2013-05-26T15:43:41.287 に答える
0

このコマンドにはいくつか問題があります。

まず、ネストされたバッククォートをエスケープして、機能していると思われる方法で機能させる必要があります。

`find \`pwd\` -name .htaccess -exec grep -q "RedirectMatch" {} \; -print`

または、推奨されるサブシェル表記を使用します。

$(find $(pwd) -name .htaccess -exec grep -q "RedirectMatch" {} \; -print)

sed次に、インプレース-iフラグを使用している間はパイプできません。ここで何を達成しようとしていたのかわかりませんが、各ファイルで実行するだけでよいと思いますsed。文字列が存在しない場合、何も置き換えられず、効率が低下することはありません。sedファイル自体ではなく、stdin からのファイル名で実行しているだけです。だから、このようなもの:

find . -name .htaccess -exec sed -i "" 's/RedirectMatch/#RedirectMatch/g' {} \;

注: の後の引用符は、 (darwin で実行されている) -imy に必要です。これらは、フラグの引数の必要性を満たします。おそらく、ほとんどの s には必要ありません。また、他の誰かが言及したように、への呼び出しは必要ないので、それを に置き換えました。sed-isedpwd.

于 2013-05-26T16:11:31.957 に答える
0

ここまでの回答は危険なほど間違っています。任意の出力を含むように操作できます"./ /etc/passwd /.htaccess"( /etc/passwd.

while IFS='' read -r -d '' filename; do
  sed -i -e 's/^([^#]+)RedirectMatch/\1#RedirectMatch/' "$filename"
done < <(find . -name .htaccess -print0)

ただし、 usingsed -iは移植性がないことに注意してください。-iフラグは POSIX で指定されておらず、多くのオペレーティング システムではサポートされていません。ex編集には、POSIX で指定され、コマンド モードと同じ構文を使用する編集を使用することをお勧めしviます。

while IFS='' read -r -d '' filename; do
  ex "$filename" -s - <<<'%s/^\([^#]*\)RedirectMatch/\1#RedirectMatch/'$'\n''x'
done < <(find . -name .htaccess -print0)
于 2013-05-26T20:30:48.893 に答える