2017-06-29 10 views
1

私は、HTMLファイルのかなり単純なオカレンスを置き換えるために、sed BRE(基本正規表現)の規則に従おうとしています。sedを使ってHTMLファイル内の可変テキストを置き換えよう

私はthe specを正しくフォローしていると思いますが、私の試みはうまくいっていません。

私がしたいのは、1つのメタタグの内容を新しいもの(私が書いているスクリプトの一部として計算している)で置き換えることです。基本的には、メタタグは次のようになります。

<meta version="v0.103.2" />

それは常にJSの正規表現にとして特徴付けることができ、その構文、次の属性が含まれます。私はそう

/version=\"v[0-9]+\.[0-9]+\.[0-9]+\"/g

を私は物事を誤解していない限り、この作業をするためにsedコマンドをたくさん試しました。文書化されているようには動作しないようです。私が試したコマンドのいくつか:

私は(あるためsed syntax changes between Unix/Linuxの問題)、Mac上だし、これは以下のコマンドで''を占めています。

 
✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g './src/index.html' 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./src/index.html 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[:digit:]+\.[:digit:]+\.[:digit:]+/version=\whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:]+\.[:digit:]+\.[:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]/whatever/g ./src/index.html 
✗ sed -i '' s/v[0-9]+\.[0-9]+.[0-9]+/whatever/g ./src/index.html 
✗ sed -i '' s/version=\"[^ \"]+\"/whatever/g ./src/index.html 
✗ sed -i '' s/version="[^ "]+"/whatever/g ./src/index.html 
✗ sed -i '' s/version=\"[^\"]+\"/whatever/g ./src/index.html 
✗ sed -i '' s/version=/whatever=/g ./src/index.html 
✗ sed -i '' s/version=\"/whatever=\'/g ./src/index.html 
✗ sed -i '' s/version=\"[^\"]/whatever=\"/g ./src/index.html 

ヘルプ? です。ファイルが正しく見つかりました。正規表現を含まないバージョンを試してみると(下から3番目を参照)、正しく置き換えられますが、何とか私の正規表現の構文がここで動作していないようです。

これを行うには、より簡単で信頼性の高い方法をお考えですか?

+1

'sedの-i '' "S /バージョン= \" V [0-9] *試してみてください\ [。 0-9] * \。[0-9] * \ "/ whatever =/g"/src/index.html' –

+0

@WiktorStribiżew - それがうまくいった!私はそれを選択することができるように答えをしたいですか? – Sasha

答えて

2

あなたはBRE POSIXで*(つまり以上の出現にマッチする)、または\{1,\}範囲の数量詞(、のいずれかを使用します(それはBRE POSIXによってリテラル+として扱われている)正規表現、代わりに+のを引用する必要があります{n,m}は、1回以上の一致に一致する\{m,n\}と書かれていなければなりません。

したがって、あなたは、単一引用符で

sed -i '' "s/version=\"v[0-9]*\.[0-9]*\.[0-9]*\"/whatever=/g" ./src/index.html 

を使用することがあります。

sed -i '' 's/version="v[0-9]*\.[0-9]*\.[0-9]*"/whatever=/g' ./src/index.html 
+2

なぜ二重引用符で囲み、二重引用符をエスケープするのですか?一重引用符を使用するだけで、二重引用符を逃す必要はありませんか? –

+0

@ベンジャミンW:はい、できます。あなたは最初のことではなく、2度目のことでもありません。私は主にC#でプログラミングしており、一重引用符では定義できないC#の文字列リテラルに非常に慣れています。私は最近、Linuxで 'grep'、' sed'などの作業を始めました。 –

関連する問題