範囲パターンの特定の項目を印刷するには?

範囲パターンの特定の項目を印刷するには?

やや特殊な形式の文字列から複数のデータフィールドを抽出しようとしています。

各文字列の形式は次のようになります(強調のためにスペースが追加されます)。

1 abcd 2 1 efg 2 hij 3 klmnopqrs 5 tuv 6 5 wxyzäüö 6

各数字は異なるフィールド区切り文字を表します。これが私が抽出したいものです。

  abcd           hij   klmnopqrs 5 tuv 6   wxyz 

場合によっては、1..2パターンが一度だけ表示されます。範囲は以前のみ表示されます。範囲はのみ表示されます。5..61..235..63

これまで、次のコードを正常に抽出してabcd使用していました。hij

  • abcd:

    echo "$STRING" | awk 'BEGIN{ RS="2"}{gsub(/.*1/,"");print;exit}'
    
  • hij:

    echo "$STRING" | awk 'BEGIN{ RS="3"}{gsub(/.*2/,"");print;exit}'
    

wxyz今、合計を求める方法を探していますklmnopqrs

  • wxyzはい上位4つ文字最後 5..6文字列範囲パターン
  • klmnopqrsによって最初発生3最後起こった5

1時間オンラインで検索したところ、今何をするのかわかりません。これらの範囲パターンを抽出する方法を見つけることができれば非常に感謝します。

編集する:以下は、現実に近いいくつかの入力例です。

(test)(te st) tesst. test test test test [teest] [teseeet]
(teeeest)(te st) tst. tet test [teseet]
(tst) tst. tet test [tseeet]

それぞれの場合に私が抽出したい内容は次のとおりです。

 test         tesst  test test test test [teest] tese
 teeeest         tst  tet test tese
 tst  tst  tet test  tsee

ご覧のとおり、フィールド区切り文字は特殊文字です。文字列の幅と範囲の1..25..6(ここで、および(..)[..]は可変です。

答え1

echo "1 abcd 2 1 efg 2 hij 3 klmnopqrs 5 tuv 6 5 wxyzäüö 6" | 
perl -lne '
    @out = ();
    /1 (.+?) 2/                 and push @out, $1;
    /.+2 \K(.+?) 3 (.+?)(?= 5)/ and push @out, $1, $2;
    /(5.+?6)/                   and push @out, $1;
    /.+5 (....)/                and push @out, $1;
    print join " ", @out
'
abcd hij klmnopqrs 5 tuv 6 wxyz

正規表現特殊文字を適切にエスケープするには注意が必要です。

perl -lne '
    @out = ();
    /\((.+?)\)/                 and push @out, $1;
    /.+\) \K(.+?)\.(.+)(?= \[)/ and push @out, $1, $2;
    /.+\[(....)/                and push @out, $1;
    print join " ", @out
' <<END
(test)(te st) tesst. test test test test [teest] [teseeet]
(teeeest)(te st) tst. tet test [teseet]
(tst) tst. tet test [tseeet]
END
test tesst  test test test test [teest] tese
teeeest tst  tet test tese
tst tst  tet test tsee

希望の出力:

 test         tesst  test test test test [teest] tese
 teeeest         tst  tet test tese
 tst  tst  tet test  tsee

関連情報