egrep -R
に続いて、約10個のユニオンを含む正規表現を使用しています。たとえば、.jpg | .png | .gif
などです。これはうまく機能し、見つかったすべての文字列を.bmp
私は次のようなものを考えていました
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
したがって、ここでの問題は、sed
で同様のユニオン正規表現をどのように実行し、入力を取得したファイルに変更を保存するように指示するかです。
次のコマンドを使用します。
egrep -lRZ "\.jpg|\.png|\.gif" . \
| xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g'
egrep
:拡張正規表現を使用して一致する行を見つける
-l
:一致するファイル名のみをリスト
-R
:指定されたすべてのディレクトリを再帰的に検索します
-Z
:レコードセパレータとして\0
を使用
"\.jpg|\.png|\.gif"
:".jpg"
、".gif"
、または".png"
のいずれかの文字列に一致
.
:現在のディレクトリで検索を開始します
xargs
:stdinを引数としてコマンドを実行します
-0
:\0
をレコード区切り文字として使用します。これは、egrep
の-Z
と一致し、入力ファイル名のスペースや改行にだまされないようにするために重要です。
-l
:パラメーターとしてコマンドごとに1行を使用します
sed
:s tream ed itor
-i
:バックアップを作成せずに入力ファイルを出力に置き換えます
-e
:次の引数を式として使用します
's/\.jpg\|\.gif\|\.png/.bmp/g'
:文字列".jpg"
、".gif"
、または".png"
のすべての出現箇所を".bmp"
に置き換えます
正直なところ、適切なタスクのsedが大好きであるように、これは間違いなくPerlのタスクです。この種のワンライナーにとっては、特に「元の場所に書き戻す」のが本当に強力です(Perlの-i
スイッチはあなたのためにそれを行い、オプションで、例えば.bakを追加して古いバージョンを保持することもできます。代わりに-i.bak
を使用してください。
Perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/
sed(可能であれば)またはawkでの複雑な作業ではなく...
これを行う別の方法
find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} \;
上記のコマンドに関するいくつかのヘルプ
検索は、.
で示される現在のディレクトリで検索を行います
-name
私の場合、pom.xmlはワイルドカードを与えることができるファイルの名前です。
-exec
実行
sed
ストリームエディター
-i
大文字と小文字を区別しない
s
は代替用です
/4.6.0.../
検索する文字列
/5.0.0.../
置換される文字列
このページでコマンドを実行できませんでした: sed solution は、処理したすべてのファイルの末尾に改行を追加し、 Perl solution = findから十分な引数を受け取ることができませんでした。私は完璧に機能するこのソリューションを見つけました:
find . -type f -name '*.[hm]' -print0
| xargs -0 Perl -pi -e 's/search_regex/replacement_string/g'
これは、現在のディレクトリツリーを再帰的にたどり、search_regex
またはreplacement_string
で終わるファイルの.h
を.m
に置き換えます。
また、過去にこの目的で rpl を使用しました。
私のユースケースでは、foo:/Drive_Letter
をfoo:/bar/baz/xyz
に置き換えたいと思いました。私の場合、次のコードでそれを行うことができました。大量のファイルがあった同じディレクトリの場所にいました。
find . -name "*.library" -print0 | xargs -0 sed -i '' -e 's/foo:\/Drive_Letter:/foo:\/bar\/baz\/xyz/g'
お役に立てば幸いです。
UPDATE s | foo:/ Drive_letter:| foo:/ ba/baz/xyz | g
forループを使用して何かを試してください
for i in `egrep -lR "YOURSEARCH" .` ; do echo $i; sed 's/f/k/' <$i >/tmp/`basename $i`; mv /tmp/`basename $i` $i; done
きれいではありませんが、そうすべきです。