sedで文字列を正規表現に置き換える

sedで文字列を正規表現に置き換える

sedを使用してコマンド出力を正規表現に置き換えようとしていますが、わかりません。

regex101.comで正規表現をテストしましたが、私が望むものはかなりよくグループ化されているようです。しかし、sedが正規表現グループパターンとどのように機能するのか理解できません。

コマンド出力は次のとおりです。

appstream              CentOS Linux 8 - AppStream
baseos                 CentOS Linux 8 - BaseOS
epel                   Extra Packages for Enterprise Linux 8 - x86_64
epel-modular           Extra Packages for Enterprise Linux Modular 8 - x86_64
extras                 CentOS Linux 8 - Extras

これが私が分析したいものです:

CentOS Linux 8 - AppStream
CentOS Linux 8 - BaseOS
Extra Packages for Enterprise Linux 8 - x86_64
Extra Packages for Enterprise Linux Modular 8 - x86_64
CentOS Linux 8 - Extras

心に浮かぶ sed 正規表現は次のとおりです。

sed -E 's/"(^.*?\s)([A-Z|a-x].*)"/\2/g'

問題を見つけるのに役立つ人がいますか?

ありがとうございます!

ベストアンサー1

多くの質問があります:

  1. 一重引用符内の二重引用符はリテラルです。コマンド出力に含まれないため、"絶対一致しません。

  2. コマンドが出力される場合した先頭の引用符がある場合、行アンカーは^一致しません。後ろにそんな人

  3. ?それはおそらく、Perlの非greedy修飾子をサポートするエンジンで正規表現をテストしたでしょう。 sedでは?リテラル(BRE)または単純な数量子(ERE、励起フラグなど)なので、0または1のgreedy Matchが-E発生します。.*

  4. \s1つだけ一致一つスペース文字も.*?厳密にPerl拡張と似ています(最新バージョンのGNU sedはこれをサポートしていますが)。移植性のために次のように変更できます。[[:blank:]]

  5. |insideは[...]置換を意味しません(ただし、式が一致するのを妨げませんが、文字も一致します|)。

sed 実装を想定します。するサポート\sとそのサプリメントは\Sあなたが望むものかもしれません。

sed -E 's/^(\S+\s+)([A-Za-z].*)/\2/'

もっと簡単にできますが、

sed -E 's/\S+\s+(.*)/\1/'

それとも

sed -E 's/\S+\s+//'

空白ではなく一連の空白の後に続く一連の空白を一致させて削除します。あなたのsedがこれをするならいいえ\S`を指定する\sと、POSIX文字クラスで同じことを行うことができます。

sed -E 's/[^[:blank:]]+[[:blank:]]+//'

または、完全なPOSIX sedに制限されている場合(+モードに関係なく、どちらも数量子ではありません)

sed 's/[^[:blank:]]\{1,\}[[:blank:]]\{1,\}//'

また、見ることができます私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?

おすすめ記事