20. 正则表达式基础


正则表达式(或 regex)用于许多 *nix 命令,包括 sed。

插入符号 ^ 匹配行的开头。 显示以 103 开头的行:

$ sed -n '/^103/ p' employee.txt
103,Raj Reddy,Sysadmin

注意:仅当 ^ 是正则表达式中的第一个字符时,它才匹配行开头的表达式。 在此示例中,^N 匹配所有以 N 开头的行。

美元符号 $ 与行尾匹配。 显示以字母 r 结尾的行:

$ sed -n '/r$/ p' employee.txt
102,Jason Smith,IT Manager
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

特殊的元字符(.)匹配除行尾字符之外的任何字符。

  • . 匹配单个字符
  • .. 匹配两个字符
  • ... 匹配三个字符

在以下示例中,模式J后跟三个.字符和一个空格 将替换为Jason后跟一个空格

因此,J...employee.txt 中的 "John""Jane" 相匹配,并且这两行被相应地替换,如下所示。

$ sed -n 's/J... /Jason /p' employee.txt
101,Jason Doe,CEO
105,Jason Miller,Sales Manager

特殊字符*匹配零次或多次出现的前一个字符。 例如,模式1*匹配零个或多个 "1"。 对于本示例,创建以下 log.txt 文件:

$ vi log.txt
log: Input Validated
log:
log: testing resumed
log:
log:output created

假设您只想查看包含log:后跟消息的行。 该消息可能紧跟在日志之后,或者可能有一些空格。 您不想查看包含log:的行而不包含任何内容。

显示包含log:后跟一个或多个空格,后跟一个字符的所有行:

$ sed -n '/log: *./ p' log.txt
log: Input Validated
log: testing resumed
log:output created 

注意:在上面的示例中,末尾的.是必需的。 如果不包括在内,sed 还将仅打印所有包含log:的行。

特殊字符\+匹配前一个字符的一次或多次出现。 例如,\+之前的空格,即\+匹配至少一个或多个空格字符。

我们使用相同的 log.txt 作为示例文件。

显示包含log:后跟一个或多个空格的所有行:

$ sed -n '/log: \+/ p' log.txt
log: Input Validated
log: testing resumed

注意:除了不匹配仅log:行之外,上面的示例也不匹配行 "log:output created",因为该行中log:后面没有空格。

特殊字符\?匹配前一个字符的零次或一次出现,如下所示。

$ sed -n '/log: \?/ p' log.txt
log: Input Validated
log:
log: testing resumed
log:
log:output created

如果要在内容中搜索特殊字符(例如: *.),则必须在正则表达式中转义特殊字符。

$ sed -n '/127\.0\.0\.1/ p' /etc/hosts
127.0.0.1 localhost.localdomain localhost

字符类只不过是方括号内提到的字符列表,这用于仅匹配多个字符中的一个。

匹配任何包含 2 或 3 或 4 的行:

$ sed -n '/[234]/ p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer 

在方括号内,您可以使用连字符来指定字符范围。 例如,[0123456789] 可以用 [0-9] 表示,并且可以指定字母范围,例如[a-z][A-Z]等。

匹配任何包含 2 或 3 或 4 的行(另一种形式):

$ sed -n '/[2-4]/ p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer