1

他のファイルへの参照を見つけて見つけるスクリプトをbashで作成しています(htmlファイル内のimgソース(image.jpg)への参照など)

問題は、(この例では) "/some/random/directory/image.jpg"を含むすべてのインスタンスを置き換えるために sed を使用していることです。

some/random/directory/image.jpg」は毎回異なるため、sed行に関しては正規表現を使用する必要がありますが、置き換える行を見つけるにはimage.jpgを含める必要があります.

たとえば、私の sed 行は次のようになります

sed 's/\/some\/random\/directory\/image.jpg/images\/image.jpg/g'

しかし、どうすれば見つけたものの終わりを取得し、それを置換に入れることができますか? (この例ではimage.jpgになります。それを変数にする方法はありますか?

現在のスクリプトは次のとおりです。

#!/bin/bash

cd /home/username/www/immrqbe/

for file in $(grep -rlI ".jpg" *)
do
sed -e "s/\".*\/.*.jpg//ig" $file > /tmp/tempfile.tmp
mv /tmp/tempfile.tmp /home/username/www/immrqbe/$file
done

助けが必要なため、これは明らかに機能的に完全ではありませんが、どのように完成させたいかがわかります。

4

2 に答える 2

5

探しているものは、正規表現の世界では後方参照と呼ばれます。以前に一致した文字列を参照したい。

sed でこれを行うにはいくつかの方法がありますが、使用したいのはグループ化メカニズムです:\(\). sed が と の間\(で見つけ\)たものはすべてグループに入れられ、使用したいグループの番号 (左から右) を使用し\nてそのグループを参照できます。n

したがって、あなたの例では、次のことが必要です。

sed 's/".*\/\(.\+\.jpg\)"/\1/ig' file

ファイル名はグループに含まれ、置換セクション\(.\+\.jpg\)で使用して参照できます。\1


補足として、シェルに引用符で囲まれた文字列の変数を展開させたくない限り、単一引用符を使用して、パターン内の二重引用符をエスケープしないようにすることができます。

于 2012-06-03T21:33:37.847 に答える
3

括弧を使用して一致をキャプチャし、バックスラッシュを使用して参照します。

sed -e 's/".*\/\(.*.jpg\)/\1/ig'
于 2012-06-03T19:55:53.680 に答える