Linux脚本攻略学习笔记13

来源:互联网 发布:东莞网络推广公司 编辑:程序博客网 时间:2024/05/01 16:13

使用sed进行文本替换

sed是流编辑器的缩写,他是文本处理中不可或缺的工具,能够配合正则表达式使用,功能不同凡响,sed命令众所周知的一个用法是进行文本替换。

(1)sed可以替换给定文本中指定的字符串

$sed 's/pattern/replace_string/' file
或者
$ cat file | sed 's/pattern/replace_string/'
该命令从stdin中读取输入。
在默认情况下,sed只会打印替换后的文本。如果需要在替换的同时保存更改,可以使用-i选项,可以将替换结果应用于源文件。很多用户在进行替换之后,会借助重定向来保存文件:
$ sed 's/text/replace/' file >newfile$ mv newfile file
其实只需要一行命令就可以搞定,例如:
$sed -i 's/text/replace/' file
之前看到的sed命令会将每一行中 每一处符合模式的内容都替换掉。但是如果要替换所有的内容,我们需要在命令尾部加上参数g,其方法如下:
$sed  's/pattern/replace_string/g' file
后缀/g意味着sed会替换每一处匹配。但是有时候我们只需要从第n处匹配开始替换。对此,可以使用/Ng选项。
可以看下面的例子:



字符/在sed中被作为定界符使用。我们可以像下面一样使用任意的定界符:
$ sed  's:text:replace:g'$ sed  's|text|replace|g'
当定界符出现在样式内部时,我们必须使用前缀\对它进行转义:
$ sed  's|te\|xt |replace|g'
\|是一个出现在样式内部并经过转义的定界符。

(2)补充内容

sed命令包含大量可用于文本处理的选项。将这些选项以合理的次序组合,可以只用一行命令就解决很多复杂的问题。让我们看看这些选项。

(a) 移除空白行

用sed移除空白行不过是小菜一碟,空白行可以用正则表达式^$进行匹配:
$ sed '/^$/d' file

/pattern/d会移除匹配样式的行。
在空白行中,行尾标记紧随着行首标记。

(b)直接在文件中进行替换

$ sed 's/pattern/replacement/' -i filename
例如,使用指定的数字替换文件中所有3位数的数字:
首先,我们有如下文件:

则上述实现为:

上面的单行命令替换了所有的3位数字,正则表达式\b[0-9]\{3\}\b用于匹配3位数字. [0-9]表示数位取值范围,也就是从0~9. {3}表示匹配之前的字符3次。\{3\}中的\用于转义{和}。\b表示单词边界。

(c)已匹配字符串标记&

例如

正则表达式\w\+匹配每一个单词,然后用[&]替换它。&对应于之前所匹配到的单词。