众多处理文本应用的综合应用
(1)在文件中移除包含某个单词的句子
sed是进行文本替换的不二之选。这样,我们就可以通过sed用空白替代匹配的句子。
先创建一个包含替换文本的文件。例如:
我们的目标是移除包含"mobile phones" 的句子。可以用sed语句来实现:
这里的匹配模式是用来匹配整句文本的正则表达式,文件中的每一句话第一个字符都是空格,句与句之间用"."来分割。因此我们需要匹配内容的格式是:空格+若干文本+需要匹配的字符串+若干文本+句点。一个句子除了作为定界符的句点之外,可以包含任意字符。因此我们要使用[^.]。[^.]*可以匹配除句点之外的任何字符组合。用来匹配文本的"mobile phone" 被放置在两个[^.]*之间。每一个匹配的句子均被//替换。
(2)对目录中的所有文件进行文本替换
假如我们希望将所有.cpp文件中的Copyright替换成Copyleft:
$find . -name *.cpp -print0 |xargs -I{} -0 sed -i 's/Copyright/Copyleft/g' {}
工作原理:
我们使用find在当前目录下查找所有的.cpp文件,然后使用print0打印出以null字符(\0)作为分隔符文件列表。
此外还可以用-exec来完成此功能,回忆一下,find有一个选项-exec,他可以对每个find查找到的文件执行命令,我们可以使用该选项,具体如下:
$ find . -name *.cpp -exec sed -i 's/Copyright/Copyleft/g' \{\} \;
(3) 文本切片和参数操作
替换变量内容中的部分文本:
我们可以通过制定字符串的起始位置和长度来生成子串,语法如下:
$ ${variable_name:start_postion:length}
用下面的命令可以打印第五个字符之后的内容:
从第5个字符开始,打印8个字符
起始字符的索引从0开始计数,我们也可以从后向前计数,将最后一个字符索引记为-1.但是如果使用附属作为索引值,则必须将附属放入括号中,(-1)就是最后一个字符的索引。