Linux -- sed命令(2)

2 使用地址
默认情况下,在sed编辑器中使用的命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须用行寻址(line addressing)。
在sed编辑器中有两种形式的行寻址:
以数字形式表示行区间
 用文本模式来过滤出行

2.1 数字行寻址
当使用数字方式的行寻址时,可以用行在文本流中的行位置来引用。sed编辑器会将文本流中的第一行编号为1,然后继续按顺序为接下来的行分配行号。在命令中指定的地址可以是单个行号,或是用起始行号、逗号以及结尾行号指定的一定区间范围内的行。

将第三行的的第二个cat替换为dog

sed ‘3s/cat/dog/2’ test2.txt
cat cat cat cat cat
cat cat cat cat cat
cat dog cat cat cat
cat cat cat cat cat
cat cat cat cat cat

将第三行到第四行的的第二个cat替换为dog

sed ‘3,4s/cat/dog/2’ test2.txt
cat cat cat cat cat
cat cat cat cat cat
cat dog cat cat cat
cat dog cat cat cat
cat cat cat cat cat

将第三行及往后的的第二个cat替换为dog

sed ‘3,$s/cat/dog/2’ test2.txt
cat cat cat cat cat
cat cat cat cat cat
cat dog cat cat cat
cat dog cat cat cat
cat dog cat cat cat
2.2 文本行寻址
另一种限制命令作用到哪些行上的方法会稍稍复杂一些。sed编辑器允许指定文本模式来过滤出命令要作用的行,必须用正斜线将要指定的 pattern 封起来。sed编辑器会将该命令作用到包含指定文本模式的行上。

$ cat test4.txt
A has a apple
B has a apple
C has a apple
D has a apple
$ sed ‘/C/s/apple/orange/’ test4.txt
A has a apple
B has a apple
C has a orange
D has a apple
该命令只作用到匹配文本模式的行上。虽然使用固定文本模式能帮你过滤出特定的值,但其作用难免有限。sed编辑器在文本模式中采用了一种称为正则表达式(regular expression)的特性来帮助你创建匹配效果更好的模式。正则表达式允许创建高级文本模式匹配表达式来匹配各种数据。这些表达式结合了一系列通配符、特殊字符以及固定文本字符来生成能够匹配几乎任何形式文本的简练模式。

2.3 命令组合
如果需要在单行上执行多条命令,可以用花括号将多条命令组合在一起。sed编辑器会处理地址行处列出的每条命令。

$ sed ‘4{
s/D/E/
s/apple/banana/}’ test4.txt
A has a apple
B has a apple
C has a apple
E has a banana
两条命令都会作用到该地址上。当然,也可以在一组命令前指定一个地址区间。

3 d删除命令
$ sed ‘2d’ test4.txt
A has a apple
C has a apple
D has a apple
$ sed ‘2,3d’ test4.txt
A has a apple
D has a apple
$ sed ‘2,$d’ test4.txt
A has a apple
sed ‘/B/,/C/d’ test4.txt
A has a apple
D has a apple
4 i插入&a追加命令
如你所期望的,跟其他编辑器类似,sed编辑器允许向数据流插入和附加文本行。

插入( insert )命令( i )会在指定行前增加一个新行;
附加( append )命令( a )会在指定行后增加一个新行。

使用命令行时两个反斜杠不加也可以,只是看起来更美观

$ sed ‘4i\E has a apple’ test4.txt
A has a apple
B has a apple
C has a apple
E has a apple
D has a apple
$ sed ‘4a\E has a apple’ test4.txt
A has a apple
B has a apple
C has a apple
D has a apple
E has a apple

使用次提示符时非结束行的末尾则必须要加反斜杠

$ sed '4a\

E has a apple
F has a apple’ test4.txt
A has a apple
B has a apple
C has a apple
D has a apple
E has a apple
F has a apple

在末尾追加行

$ sed ‘$a\Last one has nothing’ test4.txt
A has a apple
B has a apple
C has a apple
D has a apple
Last one has nothing
5 c修改命令
修改( change )命令允许修改数据流中整行文本的内容。它跟插入和附加命令的工作机制一样,你必须在 sed 命令中单独指定新行。

数字行寻址

$ sed ‘4c\D has nothing’ test4.txt
A has a apple
B has a apple
C has a apple
D has nothing

文本行寻址

$ sed ‘/D/c\D has nothing’ test4.txt
A has a apple
B has a apple
C has a apple
D has nothing
6 y转换命令
转换( transform )命令( y )是唯一可以处理单个字符的sed编辑器命令。转换命令格式如下。

[address]y/inchars/outchars/ file

转换命令会对 inchars 和 outchars 值进行一对一的映射。 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符。这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则sed编辑器会产生一条错误消息。

$ sed ‘y/ABCD/EFGH/’ test4.txt
E has a apple
F has a apple
G has a apple
H has a apple
转换命令是一个全局命令,也就是说,它会文本行中找到的所有指定字符自动进行转换,而不会考虑它们出现的位置。

7 打印
除了用 p 标记和替换命令显示sed编辑器修改过的行,另外有3个命令也能用来打印数据流中的信息:

p 命令用来打印文本行;
=命令用来打印行号;
l(小写的L)命令用来列出行。
7.1 p 命令打印行
打印命令最常见的用法是打印包含匹配文本模式的行。

$ cat data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
$ sed -n ‘/number 3/p’ data6.txt
This is line number 3.

在命令行上用 -n 选项,你可以禁止输出其他行,只打印包含匹配文本模式的行。

也可以用它来快速打印数据流中的某些行。

$ sed -n ‘2,3p’ data6.txt
This is line number 2.
This is line number 3.
如果需要在修改之前查看行,也可以使用打印命令,比如与替换或修改命令一起使用。可以创建一个脚本在修改行之前显示该行。

$ sed -n '/3/{

p
s/line/test/p
}’ data6.txt
This is line number 3.
This is test number 3.
sed编辑器命令会查找包含数字3的行,然后执行两条命令。首先,脚本用 p 命令来打印出原始行;然后它用 s 命令替换文本,并用 p 标记打印出替换结果。输出同时显示了原来的行文本和新的行文本。

7.2 =命令打印行号
sed编辑器在实际的文本行出现前打印了行号。如果你要在数据流中查找特定文本模式的话,
等号命令用起来非常方便。

$ sed -n '/number 4/{

=
p
}’ data6.txt
4
This is line number 4.
利用 -n 选项,你就能让sed编辑器只显示包含匹配文本模式的行的行号和文本。

7.3 l命令列出行
列出( list )命令( l )可以打印数据流中的文本和不可打印的ASCII字符。任何不可打印字符要么在其八进制值前加一个反斜线,要么使用标准C风格的命名法(用于常见的不可打印字符),比如 \t ,来代表制表符。

$ cat data9.txt
This line contains tabs.
$ sed -n ‘l’ data9.txt
This\tline\tcontains\ttabs.$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值