GAWK 命令 - 2

正則匹配

gawk 默認使用 ERE 模式。

基礎用法

首先創建 foo 文本文件。

cat <<EOF > foo
a1,a2,a3
b1,b2,b3
EOF
gawk -F, '/1,a/{ print $1 }' foo
a1

呢度係用整行去匹配嘅,等價於 $0

指定字段匹配

$2 ~ 指定咗使用第 2 個字段匹配。

gawk 'BEGIN{ FS="," } $2 ~ /^[ab]2/{ print $2 }' foo
a2
b2

sub

Substitution,替換第一個匹配嘅字符串。

基本語法

sub(regex, replacement [, target])
  • regex:匹配嘅正則表達式。
  • replacement:替換匹配嘅字符串。
  • target:可選,目標字符串,默認 $0

唔提供 target,默認係整行匹配。

基礎用法

echo "aa bb aa" | gawk '{ sub(/aa/, "cc"); print }'
cc bb aa

指定替換第 3 列。

echo "aa bb aa" | gawk '{ sub(/aa/, "cc", $3); print }'
aa bb cc

特殊符號 &

echo "app cat" | gawk '{ sub(/\w+/, "[&]"); print }'
[app] cat

gsub

Global Substitution,全局替換。

基本語法

gsub(regex, replacement [, target])
  • regex:匹配嘅正則表達式。
  • replacement:替換匹配嘅字符串。
  • target:可選,目標字符串,默認 $0

唔提供 target,默認係整行匹配。

基礎用法

echo 'aa bb aa' | gawk '{ gsub("aa", "cc"); print }'
cc bb cc

指定替換第 3 列。

echo 'aa bb aa' | gawk '{ gsub("aa", "cc", $3); print }'
aa bb cc

特殊符號 &

echo "app cat" | gawk '{ gsub(/\w+/, "[&]"); print }'
[app] [cat]

匹配單詞首字符

\< 表示單詞嘅開頭。

echo 'app cat' | gawk '{ gsub(/\<[a-z]/, "[&]"); print }'
[a]pp [c]at

匹配單詞尾字符

\> 表示單詞嘅結尾。

echo 'app cat' | gawk '{ gsub(/[a-z]\>/, "[&]"); print }'
ap[p] ca[t]

gensub

General Substitution,通用替換。

  • subgsub 強大。
  • 支持捕獲組(Capture Groups)。
  • 可選擇替換特定匹配項。
  • 唔原地修改,返回替換後嘅字符串。
  • subgsub 唔支持捕獲組。

基本語法

gensub(regex, replacement, how [, target])
  • regex:匹配嘅正則表達式。
  • replacement:替換字符串,可用捕獲組。
  • how:可指定全局或第 N 次匹配替換。
  • target:可選,目標字符串,默認 $0

基礎用法

使用 g 全局替換。

echo "aa aa aa" | gawk '{ print gensub(/aa/, "bb", "g") }'
bb bb bb

替換第 2 個匹配項。

echo "aa aa aa" | gawk '{ print gensub(/aa/, "bb", "2") }'
aa bb aa

使用捕獲組

\1 表示第一個匹配參數。

echo "aa-bb" | gawk '{ print gensub(/(\w+)-(\w+)/, "\\2:\\1", "g")}'
bb:aa