2016-08-25 4 views
3

bashを使用して、特定の文字列Aを含むファイルでbashを使用してファイルを置換しようとしました(BCと置き換えます)。特定の文字列を含むファイルに対してのみsedを呼び出す - ファイル名に空白文字で問題がある

私は

grep -Rl "A" | xargs sed -i 's/B/C' 

を試みたが、ファイル名が醜い回避策として空白

が含まれている場合、これは失敗し、私はプレースホルダで空白に置き換えられ、次の解決策を考え出した:

for FILE in `grep -Rl "A" | tr " " "@"`; 
    do F1=`echo $FILE | tr "@" " "`;sed 's/B/C/' "$F1"; 
done 

もっと洗練されたソリューションがありますか? grepコマンドの各ファイル名の後に

grep --null -Rl 'A' . | xargs -0 sed -i '' 's/B/C/' 

--null出力ゼロバイト(ASCII NUL文字)をしてxargs -0xargsにヌル終了の入力を読み取ります

+0

も参照してください。http://stackoverflow.com/q/15976570/2908724 – bishop

答えて

2

あなたはxargsためgrep-0ため--nullを使用することができます。

1

grepの引数--nullとxargsの引数を組み合わせて、引数をNUL文字で区切ることができます。

man grep: 
--null Prints a zero-byte after the file name. 

man xargs: 
-0  Change xargs to expect NUL (``\0'') characters as separators, 
     instead of spaces and newlines. This is expected to be used in 
     concert with the -print0 function in find(1). 
1

ファイルを見つけるためのUNIXツールはありませんgrepfind、適切に十分な、名前が付けられています。

find . -type f -exec grep -l -Z 'A' {} + | 
xargs -0 sed -i 's/B/C' 
+0

ありがとう!もちろん私はfindを知っていますが、あなたのソリューションはgrepを使います(したがって、2つではなく3つのツールを使用します)。私もあなたの解決策を試しましたが、grepのために-Zがなく、空白を処理するためのxargsが-0であったため、動作させることができませんでした。だからgrepの代わりにfindを使っても私の質問には答えられません... –

+0

grepを使わないとは言わなかったので、ファイルを見つけるために 'find'を使い、' g/re /ファイル内に「p」を挿入します。はい、3つのツールが2よりも優れています。GNUの人たちは、grepにファイルを見つける能力を与えたときに、それぞれのツールのUNIX哲学に反するようになりました(出力の並べ替えの次のオプションは? GNU grepは、無関係な引数を混乱させるだけのものです。 GNU grepオプション '-R'を使用していたときに、どのようにGNUのgrepとxargsオプションがヌルで終了するファイル名に欠けているのでしょうか? –

関連する問題