Linux sed正規表現エスケープ

Linux sed正規表現エスケープ

sed -iを使用してxmlファイルのポート値を置き換えました。

<property name="port" value="8954" />

しかし、正規表現を避ける方法がわかりません。正規表現は以下にあります。

(?<=name="port"\s+value=")\d+(?=")

私のコマンドは

sed -i "s/${PORTREX}/$NEWPORT/g" config.xml

ベストアンサー1

私はこれがすでに解決策であることに気づいていなかったので、これをコメントに書きました。 OPはうまくいくように書いたので、今回は答えとして:

sed "s/\(name=\"port\" *value=\"\)[0-9]*/\1$NEWPORT/g" config.xml

OPで提案された正規表現は、いくつかの非標準拡張を使用するため、機能しませんが、sed必要ではありません。

sed -iを使用してxmlファイルのポート値を置き換えました。

しかし、正規表現を避ける方法がわかりません。正規表現は以下にあります。

  • 「lookbehind」の代わりに文字列をそのまま使用できますが、サブ式としてマークして置換で再(?<=somestring)使用\(somestring\)するので、\1「これは必要ですが置き換えることはできません」と言う代わりに、単に置き換えてください。そしてそれ自体
  • は(1つ以上発生)+の短縮語ですが、に\{1,\}置き換えることもできます。この場合、単純を使用するとゼロ回発生が不可能になり、時間を節約できます。a+aa**
  • 私の考えでは、読書は読書\dよりも重要ではありません。[0-9]
  • \s[[:space:]]またはで置き換えることができます[ <literal tab>]。ここの簡単なスペースがそれを行うでしょう

結論:ほとんどすべての正規表現の拡張は簡単に避けられ、わずかに冗長または読みにくいパターンが発生する可能性がありますが、一般に欠点はありません。1つの例外は貪欲ではない一致です。場合によっては、一致せずに別の概念が必要です。

おすすめ記事