0

grep を sed と組み合わせて使用​​する場合、標準のスラッシュ区切り文字が使用されている限り、すべて問題ありません。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '/./d' {} \;

これを「+」や「#」などの別の文字に変更すると機能しません (テスト文字列に「/」文字が含まれていてエラーが発生する可能性があるため、これを変更する必要があります。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '#.#d' {} \;

この問題の周りに何かありますか?

4

5 に答える 5

1

最初の区切り文字をバックスラッシュする必要があります

sed(OSXなど)で使用されることがあるBSDのマニュアルページでは明確にされていませんが、sedの正規表現アドレスに任意の区切り文字を使用すると、REの前に円記号が付いている場合にのみ機能します。

\xMATCHTHISxd

MATCHTHISこれにより、どこかにある行が削除されます。

于 2012-12-13T17:30:49.517 に答える
1

sed の man ページによると、任意の文字が構文\cregexpcwhere cis any characterの正規表現に一致する行として使用される可能性があります。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '\#.#d' {} \;
于 2012-12-13T17:25:45.960 に答える
1

削除コマンドで別の区切り文字を使用する場合はsed、次のようにバックスラッシュでアドレスを開始する必要があります。

sed -i '\#.#d'
于 2012-12-13T17:26:39.030 に答える
1

これは、区切り文字を本当に変更できず、次のようなバックスラッシュを使用してすべてのインスタンスをエスケープした場合、 /\

sed -i '/\//d'

しかしsed -i '\#/#d'、トリックもそうです。これにより、. を含むすべての行が削除されます/

はまったく必要ないと感じているので、何をしようとしているのか教えてください。

于 2012-12-13T17:24:11.893 に答える
1

teststring を含むファイルを空にしようとしているようです。それは単に次のようになります。

find . -maxdepth 2 -xdev -type f | 
while IFS= read -r file; do
   if grep -i "teststring" -q "$file"; then
      > "$file"
   fi
done

少なくとも 1 文字を含む行だけを削除する場合は、次のようになります。

find . -maxdepth 2 -xdev -type f | 
while IFS= read -r file; do
   if grep -i "teststring" -q "$file"; then
      sed -i '/^./d' "$file"
   fi
done

文字列「foo」を含む行を削除する場合は、次のようになります。

find . -maxdepth 2 -xdev -type f | 
while IFS= read -r file; do
   if grep -i "teststring" -q "$file"; then
      sed -i '/foo/d' "$file"
   fi
done

そのパターンに従うだけで、改行を含むファイル名がないと仮定すると、やりたいことは何でも簡単です。必要に応じて grep を検索行に移動することもできますが、それは無意味で、コードがわかりにくくなります。

于 2012-12-13T18:19:19.777 に答える