Linux sed命令

        sed是流编辑器的缩写。它是文本处理中不可或缺的工具,能够配合正则表达式使用。sed命令的一个用法是进行文本替换。
(1)sed可以替换给定文本中的字符串。
$ sed 's/pattern/replace_string' file
或者
$ cat file | sed 's/pattern/replace_string'
该命令从stdin中读取输入。
(2)在默认情况下,sed只会打印替换后的文本。如果需要在替换的同时保存更改,可以使用-i 选项,可以将替换结果应用于原文件。再进行替换之后,可以借助重定向来保存文件:
$ sed 's/text/replace/' file >newfile
$ mv newfile file
其实只需要一条命令就可以搞定,例如
$ sed -i 's/text/replace' file
(3)sed命令会将每一行中的第一处符合模式的内容替换掉。但是如果要替换所有内容,需要在命令尾部加上参数g,其方法如下:
$ sed 's/pattern/replace_string/g' file
后缀/g意味着sed会替换掉每一处匹配。但是有时候只需要从第n处匹配开始替换。对此,可以使用/Ng选项。
请看下面的命令:
$ echo thisthisthisthis | sed 's/this/THIS/2g'
thisTHISTHISTHIS
$ echo  thisthisthisthis | sed 's/this/THIS/2g'
thisthisTHISTHIS
$ echo thisthisthisthis | sed 's/this/THIS/4g'
thisthisthisTHIS
字符/在sed中被作为定界符使用。可以像下面一样使用任意的定界符:
sed 's:text:replace:g'
sed 's|text|replace|g'
当定界符出现在样式内部时,必须使用前缀\对它进行转义:
sed 's|te\|xt|replace|g'
\ |是一个出现在样式内部并经过转义的定界符。

sed的其他特性
sed命令包含大量可用于文本处理的选项。将这些选项以合理的次序组合,可以只用一行命令就解决很多复杂的问题。
1、移除空白行
用sed移除空白行非常简单,空白行可以用正则表达式^$进行匹配:
$ sed '/^$/d' file
/pattern/d会移除匹配样式的行
在空白行中,行尾标记紧随着行首标记。

2、直接在文件中进行替换
如果将文件名传递给sed,它会将文件内容输出到stdout。如果我们想修改文件内容,可以使用-i选项:
$ sed 's/PATTERN/replacement/' -i filename
例如,使用指定的数字替换文件中所有3位数的数字:
$ cat sed_data.txt
11 abc 111 this 9 file contains 111 11 88 numbers 0000
$ sed -i 's/\b[0-9]\{3\}\b/NUMBER/g' sed_data.txt
$ cat sed_data.txt
11 abc NUMBER this 9 file contains NUMBER 11 88 numbers 0000
上面的单行命令替换了所有的3位数字。正则表达式\b[0-9]\{3\}\b用于匹配3位数字。[0-9]表示数位取值范围,也就是说从0~9。{3}表示匹配之前的字符3次。\{3\}中的\用于转义{和}。\b表示单词边界。

3. 已匹配字符串标记(&)
在sed中,可以使用&标记匹配样式的字符串,这样就能够在替换字符串时使用已匹配的内容。
例如:
$ echo this is an example | sed 's/\w\+/[&]/g'
[this] [is] [an] [example]
正则表达式 \w\+ 匹配每一个单词,然后我们用[&]替换它。& 对应于之前所匹配到的单词。

4、子串匹配标记(\1)
& 代表匹配给定样式的字符串。但我们也可以匹配给定样式的其中一部分。来看看具体的做法。
$ echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number
这条命令将digit 7替换为7。样式中匹配到的子串是7。\(pattern\)用于匹配子串。模式被包括在使用斜线转义过的()中。对于匹配到的第一个子串,其对应的标记是 \1,匹配到的第二个子串是 \2,往后依次类推。下面的示例中包含了多个匹配:
$ echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
EIGHT seven
([a-z]\+\)匹配第一个单词,([A-Z]\+\)匹配第二个单词。\1和\2用来引用它们。这种引用被称为向后引用(back reference)。在替换部分,它们的次序被更改为\2 \1,因此结果就呈现出逆序的形式。

5. 组合多个表达式
可以利用管道组合多个sed命令:
sed 'expression' | sed 'expression'
它等价于
$ sed 'expression; expression'
或者
$ sed -e 'expression' -e expression'
例如:
$ echo abc | sed 's/a/A/' | sed 's/c/C/'
AbC
$ echo abc | sed 's/a/A/;s/c/C/'
AbC
$ echo abc | sed -e 's/a/A/' -e 's/c/C/'
AbC
6. 引用
sed表达式通常用单引号来引用。不过也可以使用双引号。双引号会通过对表达式求值来对其进行扩展。当我们想在sed表达式中使用一些变量时,双引号就能派上用场了。
例如:
$ text=hello
$ echo hello world | sed "s/$text/HELLO/"
HELLO world
$text的求值结果是hello。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值