cmdを使用してsed
すべてのパターンを1行に印刷したいです。私はgrep -Pe
andを使ってこれを行う方法を知っています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つの一致が返されます。