📅  最后修改于: 2023-12-03 14:39:25.078000             🧑  作者: Mango
AWK 是一个允许使用类似于 grep 和 sed 命令的文本过滤器的编程语言,它支持正则表达式以及变量、循环、条件语句等编程元素。AWK 的主要功能是读取输入文件,根据匹配模式执行特定的命令或代码块,并将结果打印到标准输出。
正则表达式是 AWK 中一个非常强大的工具,它允许我们在文本中查找和匹配模式,并执行相应的操作。
AWK 支持基本正则表达式(BRE)和扩展正则表达式(ERE),它们的语法非常相似,但有一些区别。
| 元素 | 说明 |
| --- | --- |
| .
| 匹配任意一个字符 |
| []
| 匹配方括号中任何一个字符 |
| [^chars]
| 匹配不在方括号中的任何一个字符 |
| \<
| 匹配一个单词的起始位置 |
| \>
| 匹配一个单词的结束位置 |
| ^
| 匹配一行的开头 |
| $
| 匹配一行的结尾 |
| *
| 匹配前一个字符 0 或多次 |
| +
| 匹配前一个字符 1 或多次 |
| ?
| 匹配前一个字符 0 或 1 次 |
| \{n,m\}
| 匹配前一个字符 n 到 m 次 |
| \{n,\}
| 匹配前一个字符至少 n 次 |
| \{,m\}
| 匹配前一个字符最多 m 次 |
| \(...\)
| 用于捕获子表达式 |
ERE 语法扩展了 BRE 语法,并添加了一些新的元字符和语法。
| 元素 | 说明 |
| --- | --- |
| ()
| 用于捕获子表达式 |
| |
| 或运算符 |
| ?
| 匹配前一个字符 0 或 1 次 |
| +
| 匹配前一个字符 1 或多次 |
| *
| 匹配前一个字符 0 或多次 |
| {m,n}
| 匹配前一个字符 m 到 n 次 |
| [^chars]
| 匹配不在方括号中的任何一个字符 |
| [[:class:]]
| 匹配字符类 |
| \w
| 匹配任意一个单词字符 |
| \W
| 匹配任意一个非单词字符 |
| \s
| 匹配任意一个空格字符 |
| \S
| 匹配任意一个非空格字符 |
| \d
| 匹配任意一个数字字符 |
| \D
| 匹配任意一个非数字字符 |
在 AWK 中使用正则表达式非常简单,我们只需要将正则表达式放在斜杠之间,作为匹配模式即可。可以使用 ~
运算符在条件语句中匹配正则表达式。
下面是一些 AWK 替换和删除操作的示例:
# 将文件中所有 'foo' 替换成 'bar'
awk '{gsub(/foo/, "bar"); print}' file.txt
# 删除文件中所有以 'foo' 开头的行
awk '!/^foo/ {print}' file.txt
# 将文件中所有以 'foo' 开头的行替换成 'bar'
awk '/^foo/ {gsub(/^foo/, "bar"); print} !/^foo/ {print}' file.txt
在上面的示例中,我们使用了 gsub()
函数来替换字符串。该函数将在整个字符串中查找匹配模式并替换。我们还使用了 !
运算符来反转匹配条件,即匹配不以 'foo' 开头的行。
AWK 的正则表达式是一个非常强大的工具,可以帮助我们在文本中快速查找和匹配模式,并执行相应的操作。有了正则表达式的帮助,开发者们将能够更轻松地编写复杂的 AWK 程序,并处理大量的数据。