1

特定のディレクトリに約150個のHTMLファイルがあり、変更を加えたいと思います。一部のアンカータグには、次の行に沿ってhrefがありますindex.php?page=something。それらすべてをに変更してほしいsomething.html。単純な正規表現、単純なスクリプト。しかし、私はそれを正しく理解できないようです。誰かが私が間違っていることに重きを置くことができますか?

出力の前後のサンプルhtml:

<!-- Before -->
<ul>
    <li><a href="#">Apple</a></li>
    <li><a href="index.php?page=dandelion">Dandelion</a></li>
    <li><a href="index.php?page=elephant">Elephant</a></li>
    <li><a href="index.php?page=resonate">Resonate</a></li>
</ul>

<!-- After -->
<ul>
    <li><a href="#">Apple</a></li>
    <li><a href="dandelion.html">Dandelion</a></li>
    <li><a href="elephant.html">Elephant</a></li>
    <li><a href="resonate.html">Resonate</a></li>
</ul>

スクリプトファイル:

#! /bin/bash

for f in *.html
do
    sed s/\"index\.php?page=\([.]*\)\"/\1\.html/g < $f >! $f
done
4

3 に答える 3

4

それはあなたの正規表現であり、シェルがあなたの正規表現のビットを解釈しようとしているという事実です。

最初に-[.]*任意の数のリテラルドットに一致します.。に変更し.*ます。

次に、正規表現全体を一重引用符で囲み、'bashシェルが正規表現を解釈しないようにします。

sed 's/"index\.php?page=\(.*\)"/\1\.html/g'

また、代わりに< $f >! $f「-i」スイッチをsedにフィードして、インプレースで動作させることもできます。

sed -i 's/"index\.php?page=\(.*\)"/"\1\.html"/g' "$f"

\1.html(また、別のポイントとして、新しいURLがHTML内で引用されるように、置換の前後に二重引用符が必要だと思います。ファイル名にスペースが含まれている場合、bashが文句を言うので、私もあなた$fを引用しました)。"$f"

編集:@TimPoteが指摘しているように、引用符内で何かを照合する標準的な方法は、".*?".*貪欲ではないように)または"[^"]+"です。Sedは前者をサポートしていないので、試してみてください。

sed -i 's/"index\.php?page=\([^"]\+\)"/"\1\.html"/g' "$f"

これは、(たとえば) (捕らえられた場所で、貪欲に)<a href="index.php?page=asdf">"asdf"</a>変わるのを防ぐためです。<a href="asdf">"asdf.html"</a>(.*)asdf">"asdf

于 2012-05-17T02:44:39.390 に答える
1

あなた.*は貪欲すぎました。[^"]\+代わりに使用してください。さらに、あなたの見積もりはすべて台無しにされました。代わりに、全体を一重引用符で囲んでください。そうすれば、"それらをエスケープせずに使用できます。

sed -i 's/"index\.php?page=\([^"]\+\)"/"\1\.html"/g'

この操作全体は、次を使用して1つのステートメントで実行できますfind

find . -maxdepth 1 -type f -name '*.html' \
 -exec sed -i 's/"index\.php?page=\([^"]\+\)"/"\1\.html"/g' {} \+
于 2012-05-17T02:44:25.057 に答える
0

次の作品:

 sed "s/\"index\.php?page=\(.*\)\"/\"\1.html\"/g" < 1.html 

ほとんどが角かっこだったと思います。なぜあなたがそれらを持っていたのか分かりません。ああ、sedコマンド全体を引用符で囲む必要があります。

于 2012-05-17T02:42:24.757 に答える