カテゴリー
【Awk & Jq活用講座】文字列の後方参照を理解する
※ 当ページには【広告/PR】を含む場合があります。
2021/03/31
はじめに
正規表現の後方参照とは
「後方参照」
1234-5678-8765-4321
4321
Awkの場合
gensub関数
(パターン)
gensub
man awk
gensub(r, s, h [, t])
正規表現rにマッチする対象文字列tを探します。
もし、オプションhが'g'か'G'ならば、rでマッチした全ての箇所をsで置換します。
また、オプションhが数字で指定される場合には、
指定されている番号目にマッチした箇所をsで置き換えます。
対象文字列tが未指定の場合には$0に保持されている文字列が代替されます。
置き換え文字列sで置き換わる位置は、シークエンス\nで与えられ、
この数字nは0から9までの一桁の数字となります。
このシークエンス\nは丸括弧で包んでキャプチャしたマッチング箇所を示すことにも利用できます。
また\0はマッチしたテキスト全てを返し、&文字で結合されています。
sub関数やgsub関数とは違い、元の対象文字列を変化させずに、
関数の返り値として結果を返すことに注意してください。
$ awk -F"," 'BEGIN { OFS="," } {
last4digits_ = gensub(/[0-9]{4}-[0-9]{4}-[0-9]{4}-([0-9]{4})/, "\\1", g, $2);
print $1, last4digits_;
}' << EOF
グルヤマ マムオ,1111-2222-3333-4444,000
ヌルタニ ポウスケ,5555-5555-6666-6666,222
ポロクチ ニャルミ,3333-4444-5555-9999,777
EOF
#👇出力
グルヤマ マムオ,4444
ヌルタニ ポウスケ,6666
ポロクチ ニャルミ,9999
(...)
"\\1"
jqの場合
用法:
capture(パターン)かcapture(パターン; フラグ)
この関数はJSONオブジェクトからパターン検索で得られたキャプチャに名前を付けて、
そのマッチング結果を格納します。
キャプチャする際に指定した名前はキー値として利用されます。
例:
jq 'capture("(?<a>[a-z]+)-(?<n>[0-9]+)")'
...>
入力:"xyzzy-14"
出力:{ "a": "xyzzy", "n": "14" }
$ jq -sR '[ split("\n")[] | select(length > 0) | split(",") ] |
map({
"名義": .[0],
"下4桁": .[1] | capture("[0-9]{4}-[0-9]{4}-[0-9]{4}-(?<digits>[0-9]{4})") | .digits
})
' << EOF
グルヤマ マムオ,1111-2222-3333-4444,000
ヌルタニ ポウスケ,5555-5555-6666-6666,222
ポロクチ ニャルミ,3333-4444-5555-9999,777
EOF
#👇出力
[
{
"名義": "グルヤマ マムオ",
"下4桁": "4444"
},
{
"名義": "ヌルタニ ポウスケ",
"下4桁": "6666"
},
{
"名義": "ポロクチ ニャルミ",
"下4桁": "9999"
}
]
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー