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
字符类别([0-9])
字符类只不过是方括号内提到的字符列表,这用于仅匹配多个字符中的一个。
匹配任何包含 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