データの解析に問題があります。以下のファイルから次の文字を取得したいと思いますBIG**20021208*00001**
。試してみましたがsed '/BIG.20021208.00001\**/!d;s///;s/\*.*//'
成功しませんでした。問題はline区切り記号()に関連していると思います…
。
BIG*20021208*00001**A1001…
TO*7284*0001…BIG*20021208*00001**A999…
NN*ST*XYZ Test Corporation*9*122334455…
NU*987 ELS.…
N4**NY*98765…
ITD*01*3*2**30**45*****60…
N3*123 Highway Street…
N4**12345…
ITD*001*3*2**30**30*****60…
BIG*20021208*00001**8263-83313…
ITD*001*3*2**30**30*****60…
BIG*20021208*00001**8263-83313…
私の予想結果は次のとおりです。
A1001
8263-83313
8263-83313
答え1
これを行う方法はいくつかあります。たとえば、
grep
grep -oP 'BIG\*20021208\*00001\**\K[A-Z0-9-]+' file
説明する
-o
grepは一致する行部分のみを印刷して-P
有効にします。Perl互換正規表現(PCRE) 構文。 PCREでは、\K
その点まで一致するすべての項目が削除されます(したがって印刷されません-o
)。[A-Z0-9-]
はキャラクタークラスAからZまでの大文字、数字、または-
を1回以上繰り返すことができます(+
)。ターゲット文字列に小文字を含めることができる場合は、その
-i
フラグを使用してgrepを実行するか、文字クラスを[a-zA-Z0-9-]
。- - または - -
grep -oP 'BIG\*20021208\*00001\**\K.+(?=…)' file
説明する
これは上記と同じで、ここにのみ肯定的な予測()があります。つまり、aの前に来る場合にのみ一致するという
(?=…)
意味です。.+
…
sed
sed -rn 's/…//g;s/.*BIG\*20021208\*00001\**//p;' file
説明する
s/from/to/
sedの代替演算子です。from
に置き換えられますto
。最初の項目は…
何も置き換えずに削除します(g
行内のすべての一致に対してこれが行われたことを確認してください)。 2番目は、(.*
)からBIG*20021208*00001
(*
正規表現で特別な意味を持つため)エスケープする必要がある行の先頭からすべての項目を削除し、ゼロ個以上の\*
アスタリスク()を削除します。\**
組み合わせると、必要なものを除くすべてが削除されます。-n
いかなる出力も印刷できません。最後の2番目の代替演算子は、p
sedが置換に成功したすべての嘘を印刷するようにします。アッ
awk -F'[*…]' '/BIG\*20021208\*00001\**/{print $(NF-1)}' file
説明する
-F
awkの入力フィールド区切り記号をまたは*
に設定します…
。これは、最後から2番目のフィールドが目的のフィールドになることを意味します。上記のコマンドは一致する行に印刷しますBIG*20021208*00001*
。真珠
perl -lne '/BIG\*20021208\*00001\**(.*)…/ && print "$1"' file
説明する
-n
Perlに入力を1行ずつ読み、与えられたスクリプトを適用させます-e
。各呼び出しに-l
改行文字を追加しますprint
。上記のコマンドは、関心のある文字列(上記のsedの例の説明を参照)と一致することを確認し、成功すると印刷します。awkの例と同じアプローチを使用することもできます。
perl -F'[*…]' -lane '/BIG\*20021208\*00001\**/ && print "$F[$#F]"' file
答え2
使用awk
:
awk -F\* '/^BIG/ {gsub(/…/,""); print $NF}' file
A1001
8263-83313
8263-83313