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
多くの質問があります:
一重引用符内の二重引用符はリテラルです。コマンド出力に含まれないため、
"
絶対一致しません。コマンドが出力される場合した先頭の引用符がある場合、行アンカーは
^
一致しません。後ろにそんな人?
それはおそらく、Perlの非greedy修飾子をサポートするエンジンで正規表現をテストしたでしょう。 sedでは?
リテラル(BRE)または単純な数量子(ERE、励起フラグなど)なので、0または1のgreedy Matchが-E
発生します。.*
\s
1つだけ一致一つスペース文字も.*?
厳密にPerl拡張と似ています(最新バージョンのGNU sedはこれをサポートしていますが)。移植性のために次のように変更できます。[[:blank:]]
|
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では動作しないのはなぜですか?
答え2
空白ではなく文字の後にある一連の空白を見つけて、改行文字に変更します(改行文字は間違いなく表示されないため)。次に、改行文字の前にあるすべてを取得します。最初のフィールドを削除しました。
sed -e 's/\S\s+/\n/;s/.*\n//' file