Ict-innovation/LPI/103.7
候选人应该能够使用正则表达式操作文件和文本数据。本目标包括创建包含多个符号元素的简单正则表达式。它还包括使用正则表达式工具在文件系统或文件内容中执行搜索。
关键知识领域
- 创建包含多个符号元素的简单正则表达式。
- 使用正则表达式工具在文件系统或文件内容中执行搜索。
使用grep、fgrep或egrep来查找文本中的一个或多个单词。搜索期间使用的关键词是称为正则表达式的字母组合。许多其他应用程序(例如sed和vi)也识别正则表达式。
正则表达式
传统正则表达式(regex)
正则表达式是用于匹配模式的一系列字符(或原子)。字符可以是常量(按字面意义处理)或元字符。
\<KEY | 以‘KEY’开头的单词 |
WORD\> | 以‘WORD’结尾的单词 |
^ | 一行的开头 |
$ | 一行的结尾 |
[ 范围 ] | 包含的 ASCII 字符范围 |
[^c ] | 不是字符‘c’ |
\[ | 按字面意义解释字符‘[’ |
“ca*t” | 包含‘c’后跟零个或多个字母‘a’再后跟‘t’的字符串 |
“.” | 匹配任何单个字符 |
扩展正则表达式:
主要的 eregex 为:+、?、() 和 |
"A1|A2|A3" | 包含‘A1’或‘A2’或‘A3’的字符串 |
"ca+t" | 包含‘ca’后跟任意数量的字母‘a’再后跟‘t’的字符串 |
"ca?t" | 包含‘c’后跟零个或一个字母‘a’再后跟‘t’的字符串 |
grep 实用程序支持正则表达式regex,例如表 1中列出的那些。
使用基本 grep
grep 的语法
grep PATTERN FILE
grep 的选项包括
-c | 计算与 PATTERN 匹配的行数 |
-f | 从文件获取 PATTERN |
-i | 忽略大小写敏感 |
-n | 包含匹配行的行号 |
-v | 输出所有不包含 PATTERN 的行 |
-w | 仅当模式匹配整个单词时选择行。 |
例如,列出 /etc/lilo.conf 中所有非空行
$ grep –v “^$” /etc/lilo.conf |
egrep
egrep 工具支持扩展正则表达式eregex,例如表 2中列出的那些。
egrep 实用程序将处理任何现代正则表达式。如果在命令行输入多个关键词,并用竖线字符分隔,它也可以搜索它们。
例如
$ egrep 'linux|^image' /etc/lilo.conf |
fgrep
fgrep 代表快速 grep,fgrep 按字面意思解释字符串(不支持 regex 或 eregex)。fgrep 实用程序不识别正则表达式的特殊含义。
例如
$ fgrep 'cat*' FILE |
将只匹配包含‘cat*’的单词。主要改进来自fgrep从文件中逐行输入的关键词列表(例如 LIST)中搜索的能力。语法将是
$ fgrep –f LIST FILE |
流编辑器 - sed
sed 对文件执行自动的、非交互式的编辑。它通常用于脚本中以搜索和替换文本中的模式。它支持大多数正则表达式。
sed 的语法
sed [options] 'command' [INPUTFILE]
输入文件是可选的,因为sed也适用于文件重定向和管道。以下是一些示例,假设我们正在操作一个名为 MODIF 的文件。
删除所有注释行
$ sed '/^#/ d ' MODIF |
请注意,搜索模式位于两个斜杠之间。
将 /dev/hda1 替换为 /dev/sdb3
$ sed 's/\/dev\/hda1/\/dev\/sdb3/g' MODIF |
命令中的s代表“替换”。g代表“全局”,并强制替换在每一行中都发生。您也可以指定替换应该发生的哪一行,可以使用行号或正则表达式匹配。
如果行包含关键词 KEY,则将‘:’替换为‘;’(全局)
$ sed '/KEY/ s/:/;/g' MODIF |
更高级的 sed
您可以发出多个命令,每个命令都以–e开头,在命令行输入。例如,(1)删除所有空行,然后(2)将MODIF文件中的‘OLD’替换为‘NEW’
$ sed –e '/^$/ d’ -e ‘s/OLD/NEW/g' MODIF |
这些命令也可以写入文件(例如 COMMANDS)。然后,每一行都解释为要执行的新命令(不需要引号)。
1 s/old/new/ |
/keyword/ s/old/new/g |
23,25 d |
使用COMMANDS文件的语法是
sed -f COMMANDS MODIF
这比很长的命令行更紧凑!
-e 执行以下命令 |
-f 从文件读取命令 |
-n 不打印未编辑的行 |
d 删除整行 |
r 读取文件并追加到输出 |
s 替换 |
w 将输出写入文件 |
使用的文件、术语和实用程序
- grep
- egrep
- fgrep
- sed
- regex(7)