sed を使用した複数の正規表現グループの置換

sed を使用した複数の正規表現グループの置換

次の状況の後にスペースを追加したいと思います。

<span class="negrita">ANYTHING</span>

したがって、次のSED命令を使用してください。

sed -E "s/(<span class=\"negrita\">.*?<\/span>)/\1 /g" <<< 'In <span class="negrita">1959</span> economic policy was reoriented in order to undertake <span class="negrita">the country modernization</span>. More text'

私は次のような結果を得ます。

In <span class="negrita">1959</span> economic policy was reoriented in order to undertake <span class="negrita">the country modernization</span> . More text

したがって、見てわかるように、最初の発生以降ではなく、最後の発生以降にスペースが追加されます。 「/g」オプションはすべての項目を置き換える必要があるという意味ではありませんか?

よろしくお願いします。

ベストアンサー1

*?標準拡張正規表現演算子ではありません。

sedまたはregexpエンジンの実装に応じて

  1. BSDなどのエラー報告
  2. GNUシステムと.*同じです。(.*)?
  3. perlast- openのように動作する*?貪欲ではないバージョン*sed
  4. 標準演算子ではないので、何でも、またはすべての操作を実行します。

あなたはそれをしたいようですが、3それを得ているようです2。おそらくあなたsedがGNUだからですsed

これは-E標準オプションではありませんsed(POSIX仕様の次のメジャーバージョンにも表示される可能性があります)。

perl正規表現演算子を使用するには、以下を使用する必要がありますperl

perl -pe 's:<span class="negrita">.*?</span>:$& :g'

(家庭期間sは入れ子になったり、行に分割されません)

またはを使用して、sed次のことができます(範囲内のコンテンツにが含まれていないと仮定<)。

sed 's:<span class="negrita">[^<]*</span>:& :g'

おすすめ記事