-1

再帰ディレクトリ内のいくつかのファイルで文字列を見つけて、別の文字列に置き換えたいです。

探したい文字列は0x04030000&0xffff0000.

置き換えたい文字列は0x80863a30.

いくつかの例を試しましたがgrepsedいくつかのエラーが発生しました。

grep言うように0xffff0000 command not found

Mac OS X 10.8.5 を使用しています

これは私が試したコマンドであり、受け取ったエラーです:

localhost:~ User$ grep -rl 0x04030000&0xffff0000 /Users/Niresh/Desktop/TTT | xargs sed -i 's/0x04030000&0xffff0000/0x80863a30/g'
[4] 1166
-bash: 0xffff0000: command not found
grep: warning: recursive search of stdin

[4]+  Stopped                 grep -rl 0x04030000

このコマンドも試しましたが、機能しません

localhost:~ Niresh$ mkdir TTT
localhost:~ Niresh$ echo "TTT 0x04030000&0xffff0000 bar" > TTT/bar
localhost:~ Niresh$ find TTT -type f -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \;
localhost:~ Niresh$ cat TTT/bar
TTT 0x80863a30 bar
localhost:~ Niresh$ TTT 0x80863a30 bar
-bash: TTT: command not found

sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' "Here Was My Path to The Text File"

しかし、コマンドは正常に実行されますが、テキストはまだ残っています

sed It Showsのマニュアルページを読みました

a'',バグ 値が 0x5C (ASCII `\') のバイトを含むマルチバイト文字は、 c'' およびi'' commands. Multibyte characters cannot be used as delimiters with thes'' および ``y'' コマンドへの引数で行継続文字として誤って扱われる場合があり ます。

BSD 2005 年 5 月 10 日

4

4 に答える 4

2

あなた&はあなたのシェルによって解釈されています。これを避けるには、検索を引用する必要があります。

grep -rl '0x04030000&0xffff0000' /Users/Niresh/Desktop/TTT | xargs sed -i 's/0x04030000&0xffff0000/0x80863a30/g'
于 2013-10-11T19:30:10.683 に答える
1

FatalError は&、コマンド ラインの問題をすでに特定しています。

また、Parsing LSの問題により、これはファイルを処理する方法としては不適切です。grep の出力としてファイル名をキャプチャするために xargs に頼る代わりに、find. 例えば:

# find /Users/Niresh/Desktop/TTT -type f \
    -exec grep -q '0x04030000&0xffff0000' {} \; \
    -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \;

(読みやすいように複数行に分けています。)

ここでの考え方はfind、ファイル名を担当し、各ツールを実行して (1) 分析と (2) 変更を行うというものです。grephere はおそらく冗長であることに注意してくださいsed。検索文字列が見つからないファイルには変更を加えないためです。

これにより、ファイル名に特殊文字 (スペース、改行、バックスラッシュ) が含まれている場合に、パイプによって誤って解釈される問題を回避できますxargs

更新(コメントごと):

私のために働く:

ghoti@mac:~ 507$ mkdir foo
ghoti@mac:~ 508$ echo "foo 0x04030000&0xffff0000 bar" > foo/bar
ghoti@mac:~ 509$ find foo -type f -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \;
ghoti@mac:~ 510$ cat foo/bar
foo 0x80863a30 bar
ghoti@mac:~ 511$ 

これがうまくいかない場合は、試行の結果で質問を更新してください。

于 2013-10-11T19:34:38.533 に答える
0

以下を使用できます。

find  /Users/Niresh/Desktop/TTT -type f -exec sed -i 's/0x04030000&0xffff0000/0x80863a30/g' {} \;

これでうまくいくはずです。

于 2013-10-11T19:32:56.427 に答える