特定のパターンの後の部分文字列の分離

特定のパターンの後の部分文字列の分離

ファイルには次の行があります。

<TD><TR> monogram ended in 1 </TD></TR>

monogram ended inは常に定数ですが、noです1。数字は常に変更され、最大3桁まで可能です。

monogram ended inしたがって、その文字列の後に続く数字を検索して取得するには、コマンドが必要です。

誰でも私を助けてください。

答え1

次のように使用できますsed

sed -n 's/.*monogram ended in \([0-9]*\).*/\1/p' filename
  • 以下を使用して-n正常な出力を抑制できます。
  • ubstituteコマンドはs行全体(.*開始と終了)をに置き換えます\1。これは内部部分\(\)、つまり数字です。
  • このpフラグは試合で交代選手を印刷します。

答え2

grepのGNU実装には、-P「Perl互換正規表現」で説明されている正規表現セットを有効にするオプションがあります。以下を使用でき\K、必要な方法で出力を減らすために使用できます。

grep -Po 'monogram ended in \K\d+' filename
  • この-Pオプションを使用すると、Perlスタイルの正規表現を使用できます。
  • この-oオプションは、grepに(行全体ではなく)行の一致部分のみを出力するように指示します。
  • 正規表現は説明する行と一致します。この行は「で終わる文字と数字の組み合わせです。
  • この\K式はgrepに完全正規表現を使用して行を一致させるように指示しますが、式の後の部分のみを記録します。\K
  • 式が\d+1 つ以上の数字と一致します。

上記の例では、一致する数字を3つの連続した数字に制限しません。これを行う場合、最も効率的な表現は次のとおりです。

grep -Po 'monogram ended in \K\d{1,3}(?!\d)' filename
  • 式は、\d{1,3}連続した1桁、2桁、または3桁の数字と一致します。
  • この(?!\d)式は、数字の後ろの位置を確認し、数字(文字でも行の末尾でもかまいません)ではないことを確認し、4つ以上の連続した数字がある行が一致しないようにします。

答え3

使用幸せ(以前のPerl_6)

raku -ne 'put $/ if m/ <?after "monogram ended in" \s > \d+ /;'   

Unicode文字(強力な組み込みUnicodeサポートを含む)を処理する必要がある場合、Rakuは良い選択です。上記の内容が印刷されます$/(Rakuの一致変数または$<>)。コードは、各行が<?after … >1つと一致すると仮定し、幅が0の前方遷移アサーション()を使用し、一致しない行を削除します。

一致するものがない空の行が必要な場合は、次のコードを使用してください。

raku -ne 'if m/ <?after "monogram ended in" \s > \d+ / {put $/} else {put ""};'  

Rakuの正規表現数量子を使用して、一致する数値の範囲を制限できます**。たとえば、\d**1..3そうでない場合は<digits>**1..3、長さが1〜3桁の一致のみが返されます。ただし、行は左から右に読み取られるため、3桁以上の一致する行は右端で切り捨てられます。したがって、単に数量子を追加するだけでは、期待した結果が得られない可能性があります。これを正しく行うには、数値ではなく正規表現の原子を右端に追加する必要があります。

raku -ne 'put $<> if m/ <?after "monogram ended in " > <digit>**1..3 <!digit> /;' 

入力例:

<TD><TR> monogram ended in 1 </TD></TR>
<TD><TR> duogram ended in 2 </TD></TR>
<TD><TR> monogram ended in 4444 </TD></TR>

出力例(最終コード例):1

https://raku.org

答え4

入力がXMLであり、ノードが以下のように正しい方法でソートされたとします。

<?xml version="1.0"?>
<root>
  <TR>
    <TD>monogram ended in 1</TD>
  </TR>
</root>

(およびノー​​ドの開始タグは質問で置き換えられます。TR)その後、XMLパーサーを使用して、ノードの子ノードの後ろに表示される値の部分を次のように抽出できます。TDxmlstarletmonogram ended inTDTR

xmlstarlet sel --template \
    --match    '//TR/TD[starts-with(text(),"monogram ended in ")]' \
    --value-of 'substring-after(text(),"monogram ended in ")' -nl file.xml

TDTRノードの直系子であり、文字列で始まる値を持つ各ノードについて、その文字列の後のテキストを抽出し、改行文字を追加しますmonogram ended in

次のサンプル文書の場合:

<?xml version="1.0"?>
<root>
  <TR>
    <TD>monogram ended in 1</TD>
    <TD>monogram ended in 2</TD>
    <TD>monogram ended in 3</TD>
  </TR>
  <TR>
    <TD>monogram ended in A</TD>
    <TD>monogram ended in B</TD>
    <TD>monogram ended in C</TD>
  </TR>
</root>

...コマンドが出力されます

1
2
3
A
B
C

関連情報