このテキストがありますが、開いている括弧の横にある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
印刷する前に最後の文字を消去します。