linux sed基础命令详解

sed编辑器即流编辑器(stream editor),与普通交互式文本编辑器不同(比如vim),vim你可以通过键盘命令去交互式的插入、删除或替换数据中的文本;而流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

操作过程:

(1)  一次从输入中读取一行数据。
(2)  根据所提供的编辑器命令匹配数据。
(3)  按照命令修改流中的数据。
(4)  将新的数据输出到STDOUT。

在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。

注意 sed本身是不会修改原文件的 除非加上 -i 或者将输出重定向到文件

由于命令是按顺序逐行给出的,sed编辑器只需对数据流进行一遍处理就可以完成编辑操作。这使得sed编辑器要比交互式编辑器快得多,你可以快速完成对数据的自动修改。

行寻址(line addressing):

sed编辑器种有两种形式的行寻址:

1、以数字形式的表示行数来进行匹配操作

  sed会将文本流中的第一行编号为1,之后的行顺序分配编号。

$ sed '2s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
#将第2行的dog 匹配后改成cat

$ sed '2,3s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy dog
#将2、3行的dog匹配改成cat 数字间用,分开

$ sed '2,$s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat
# $符号的用法。

2、用文本模式来匹配出行

 用法/pattern/command

[root@Centos8_test sed]# sed '/US/s/jay/zhoujielun/' sed_test ##第一个/US/用来匹配行 之后将jay替换成zhoujielun
tom 197 70kg China
jun 178 68kg China
zhoujielun 175 76kg US

命令格式:

sed options script file

其中 script有

s(substitute 替换)

s/pattern(被替换的文本)/replacement(替换文本)/flags(替换标记)

$ cat data4.txt
This is a test of the test script.
This is the second test of the test script.
$
$ sed 's/test/trial/' data4.txt
This is a trial of the test script.
This is the second trial of the test script.

有4种可用的替换标记:

1、数字,表明新文本每一行会替换第几处模式匹配的地方。

2、g,相当于每一行所有匹配的文本都会被替换。

3、p,将原先行中的内容打印出来

4、w file,将替换的结果写到一个文件中

第一种替换:

$ sed 's/test/trial/2' data4.txt
This is a test of the trial script.
This is the second test of the trial script.
只替换每行中第二次出现的匹配模式(即被替换词)

第二种替换:

$ sed 's/test/trial/g' data4.txt
This is a trial of the trial script.
This is the second trial of the trial script.
替换匹配模式所有匹配到的词

第三种替换:

p会输出修改过的行,-n选项则禁止sed编辑器输出,二者经常一起配合达到效果:只输出被替换命令替换过的行内容。

[root@Centos8_test sed]# cat sed_test
tom 197 70kg China
jun 178 68kg China
jay 175 76kg US
[root@Centos8_test sed]# sed -n '=;s/China/Japan/p' sed_test
1
tom 197 70kg Japan
2
jun 178 68kg Japan
3
##=显示行号,有China的地方匹配换成Japan,匹配到的地方输出

第四种可以将匹配部分写入到一个新的文本中: w+文件名

[root@Centos8_test sed]# sed 's/China/Japan/w match_txt' sed_test
tom 197 70kg Japan
jun 178 68kg Japan
jay 175 76kg US
[root@Centos8_test sed]# cat match_txt
tom 197 70kg Japan
jun 178 68kg Japan

d(delete 删除)

 用法sed 'd' file

$ cat data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
$
$ sed '3d' data6.txt #用到了数字行数匹配
This is line number 1.
This is line number 2.
This is line number 4.
$ sed '2,3d' data6.txt
This is line number 1.
This is line number 4.
$ sed '3,$d' data6.txt
This is line number 1.
This is line number 2.
[root@Centos8_test sed]# sed '/jay/d' sed_test #用到了文本匹配模式 删除有jay的一行
tom 197 70kg China
jun 178 68kg China

i(insert 插入)、a(append 附加)

[root@Centos8_test sed]# sed '$a\zed 155 55kg Korea' sed_test  #.append 添加 所以在后面
tom 197 70kg China
jun 178 68kg China
jay 175 76kg US
zed 155 55kg Korea
[root@Centos8_test sed]# sed '$i\zed 155 55kg Korea' sed_test #.insert 插入 所以在前面
tom 197 70kg China
jun 178 68kg China
zed 155 55kg Korea
jay 175 76kg US

c(change 修改)

[root@Centos8_test sed]# sed '$c\zed 155 55kg Korea' sed_test # $c表示将最后一行修改为\之后的内容
tom 197 70kg China
jun 178 68kg China
zed 155 55kg Korea

y(转换)

[root@Centos8_test sed]# sed 'y/j/p/' sed_test
tom 197 70kg China
pun 178 68kg China
pay 175 76kg US

sed 'y/123/789/' data8.txt # 1->7 2->8 3->9

r(从文件读取内容) 读取一个文件内容,用地址匹配决定在被修改文本的第几行后插入。

$cat data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.]

$cat data12.txt
This is an added line.
This is the second added line.

$ sed '/number 2/r data12.txt' data6.txt
This is line number 1.
This is line number 2.
This is an added line.
This is the second added line.
This is line number 3.
This is line number 4.
$ sed '3r data12.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is an added line.
This is the second added line.
This is line number 4.

 

options有这几种

-e 通俗来说就是可以多条命令一行去执行 (然而实测 加不加-e 都可以执行多条命令)

[root@Centos8_test sed]# cat data
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
[root@Centos8_test sed]# sed  's/brown/green/; s/dog/cat/; s/over/from/' data
The quick green fox jumps from the lazy cat.
The quick green fox jumps from the lazy cat.
The quick green fox jumps from the lazy cat.
The quick green fox jumps from the lazy cat.
[root@Centos8_test sed]# sed  -e 's/brown/green/; s/dog/cat/; s/over/from/' data
The quick green fox jumps from the lazy cat.
The quick green fox jumps from the lazy cat.
The quick green fox jumps from the lazy cat.
The quick green fox jumps from the lazy cat.
## 可以发现加不加 -e 效果一样的

-f 就是有大量要处理的sed命令,那么将它们放进一个单独的文件中通常会更方便一些。可以在sed命令中用-f选项来指定文件。

$ cat script1.sed
s/brown/green/
s/fox/elephant/
s/dog/cat/
$
$ sed -f script1.sed data
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
posted @ 2022-07-27 22:38  zed99  阅读(186)  评论(0编辑  收藏  举报