sedを使用して、1行にn回繰り返されるパターンを繰り返し印刷します。

sedを使用して、1行にn回繰り返されるパターンを繰り返し印刷します。

cmdを使用してsedすべてのパターンを1行に印刷したいです。私はgrep -Peandを使ってこれを行う方法を知っていますawk。私は次のように始めました:

$ sed 's/^.*label="\(.*\)" selected.*$/\1/g' <(echo 'smkj sld/6_ !label="snd 1" selected>lms slks.;label="snd 2" selected>lkwnl  wlkmlabel="snd 3" selected>The following should not be printedlabel="')
snd 3

ただし、上記の内容は間snd 3の文字列のみを印刷します。最後label="そして発生" selected。すべての行に正規表現のすべての項目を含める方法は?

答え1

これにより、GNU sed次のように目的の出力を生成できます。

$ sed -Ee '
     s/label="([^"]+)" selected[>]/\n\1\n/
     s/.*\n(.*\n)/\1/
     /\n/!d
     P;D
' input.txt

出力:

snd 1
snd 2
snd 3

Perlライナーでできます。

$ perl -lne 'print for /label="([^"]+)" selected[>]/g' input.txt

答え2

使用幸せ(以前のPerl_6)

~$ raku -ne '$/.join("\n").put if m:g/ label\= \" <(<-["]>+)> \" \h selected \> /;'  <(printf 'smkj sld/6_ !label="snd 1" selected>lms slks.;label="snd 2" selected>lkwnl  wlkmlabel="snd 3" selected>The following should not be printedlabel="')
snd 1
snd 2
snd 3

#OR

~$ raku -ne '$/.join("\n").put if m:g/ label\= \" <(<-[\c[QUOTATION MARK]]>+)> \" \h selected \> /;'  <(printf 'smkj sld/6_ !label="snd 1" selected>lms slks.;label="snd 2" selected>lkwnl  wlkmlabel="snd 3" selected>The following should not be printedlabel="')
snd 1
snd 2
snd 3

RakuはPerlファミリのプログラミング言語です。

簡単に言えば、このRakuの答えは@RakeshSharmaと同じアプローチをとります。 「質感と貪欲な」マッチングを使用して問題を解決しようとしないでください。代わりに、引用符付きターゲット文字列に内部引用符がないことに注意してください。したがって、(@RakeshSharmaに似ている)Rakuはカスタマイズを宣言します。否定的な文字クラス<-["]>+、次に変換される"引用符なしで連続した1つ以上の文字。 (疑問がある場合は、<+[…]>より簡単に言えば<[…]>カスタムメイドを意味します。ポジティブキャラクタークラス)。 2番目の答えは正式\c[QUOTATION MARK]名を明示的に使用するため、時々厳しい参照問題を回避するのに役立ちます。

その後、正規表現の残りの部分は次のようになります。

  • 必須一致の前にlabel\= \"
  • 必須一致の後には\" \h selected \>\h水平スペースを示す)が続きます。
  • 完全正規表現を一致させた後、楽<( … )> キャプチャマークすべてを投げてください。

Rakuの$/変数には最終一致が含まれているか、一致がm:global/ … /指定m:g/ … /されているため、必要な3つの一致が返されます。

https://docs.raku.org/言語/regexes
https://raku.org

関連情報