開いている括弧の横にある3文字だけをGrepしてください。

開いている括弧の横にある3文字だけをGrepしてください。

このテキストがありますが、開いている括弧の横にある3文字を見つけたいと思います。助けてください。

condition: s(XXX_ygh_ghj_jui,00.05) | s(DFG_GHH_CN_GJ_YUI_UYT_UIJ,00.05)
condition: s(GYZ_ygh_ghj_jui,00.05) | s(TYU_GHH_CN_GJ_YUI_UYT_UIJ,00.05)
condition: s(UFG_ygh_ghj_jui,00.05) | s(QWE_GHH_CN_GJ_YUI_UYT_UIJ,00.05)
condition: s(JTH_ygh_ghj_jui,00.05) | s(YUT_GHH_CN_GJ_YUI_UYT_UIJ,00.05)

私が望むo / pは

XXX DFG
GYZ TYU
UFG QWE
JTH YUT

答え1

GNUはgrepこれを行うことができますが、grep次のようにして一致を複数行に分割します。

$ grep -oP '(?<=\()...' file
XXX
DFG
GYZ
TYU
UFG
QWE
JTH
YUT

@kusalandandaがコメントで提案したように1行に入れることができますが、pasteこれは次の場合にのみ機能します。正確に1行に2つの一致があります。それ以上でも以下でもない:


$ grep -oP '(?<=\()...' file | paste -d ' ' - - 
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

私はsed同じものを使用するかperl。これらのソリューションは、1行あたり1、2つ以上の一致を処理できます。

$ sed 's/[^(]*(\(...\)[^(]*/\1 /g' file
XXX DFG 
GYZ TYU 
UFG QWE 
JTH YUT 

または

$ perl -lne '@m=(/\((...)/g); print "@m"' file
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

答え2

$ sed 's/.*(\(...\).*(\(...\).*/\1 \2/' file
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

このsed式は入力行全体と一致しますが、2つの開き括弧の後の3文字を収集します。これにより、行は間にスペースがある2つの収集された文字セットに置き換えられます。

答え3

また、次のようにawk設定されます。FS[(_]

awk -v FS='[(_]' '{print $2,$6}' file
XXX DFG
GYZ TYU
UFG QWE
JTH YUT

つまり、区切り文字は正規表現です。以下はいくつかの追加例です。 https://stackoverflow.com/questions/12204192/using-multiple-delimiters-in-awk

答え4

Aは、sed各端に余分なスペースを引き換えに「フィールド」の数に関係なく機能します。

sed -E "s/[c_][^(]+./ /g"  file

cまたはで始まるグローバル検索_

[c_]

その後にはそうでないことが続く。(

[^(]+

次の文字.(行の最後の文字になる()を追加して空白に置き換えます。

または

これもawk「フィールド数」にこだわらない。

awk -F\( '{for (i=2; i<=$NF; i++) $(i-1)=substr($i,1,3); $NF=""}1' file

FSに設定された次の(フィールドを2番目から最後まで繰り返し、フィールドをi-1フィールドの最初の3文字に等しく設定し、i印刷する前に最後の文字を消去します。

関連情報