やや特殊な形式の文字列から複数のデータフィールドを抽出しようとしています。
各文字列の形式は次のようになります(強調のためにスペースが追加されます)。
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..6
1..2
3
5..6
3
これまで、次のコードを正常に抽出して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..2
数5..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