其他分享
首页 > 其他分享> > sed详解

sed详解

作者:互联网

行匹配
-n 与 p
-n 表示不输出全部行(-n),无 -n 表示会输出全部行;-p 表示只输出匹配行(1p)

所以,

sed -n '1p' input,只输出第一行
sed '1p' input,会先输出第一行,然后输出全部行(第一行输出两次)
sed -n '3,6p' input,只输出 3-6 行

[root@oraclehost tmp]# sed -n '1p' test1.txt   //-n的使用
This is a Certificate Request file:
[root@oraclehost tmp]# sed '1p' test1.txt    //-p的使用
**This is a Certificate Request file:**
**This is a Certificate Request file:**

It should be mailed to zawu@seu.edu.cn

==========================================================================
Certificate Subject:

        /O=Grid/OU=GlobusTest/OU=simpleCA-seugrid1.sed.edu.cn/OU=seu.edu.cn/CN=globus

  The above string is known as your user certificate subject,and it uniquely identifies this user.$88
  To install this user certificate,please save this e-mail message into the following file.

  /home/globus/.globus/usercert.pem
[root@oraclehost tmp]# sed '8p' test1.txt  	//-p的使用
This is a Certificate Request file:

It should be mailed to zawu@seu.edu.cn

==========================================================================
Certificate Subject:

       ** /O=Grid/OU=GlobusTest/OU=simpleCA-seugrid1.sed.edu.cn/OU=seu.edu.cn/CN=globus**
       ** /O=Grid/OU=GlobusTest/OU=simpleCA-seugrid1.sed.edu.cn/OU=seu.edu.cn/CN=globus**

  The above string is known as your user certificate subject,and it uniquely identifies this user.$88
  To install this user certificate,please save this e-mail message into the following file.

  /home/globus/.globus/usercert.pem
[root@oraclehost tmp]# sed -n '3,6p' test1.txt
It should be mailed to zawu@seu.edu.cn

==========================================================================
Certificate Subject:
[root@oraclehost tmp]# sed '3,6p' test1.txt
This is a Certificate Request file:

**It should be mailed to zawu@seu.edu.cn**
**It should be mailed to zawu@seu.edu.cn**


==========================================================================
==========================================================================
**Certificate Subject:**
**Certificate Subject:**

        /O=Grid/OU=GlobusTest/OU=simpleCA-seugrid1.sed.edu.cn/OU=seu.edu.cn/CN=globus

  The above string is known as your user certificate subject,and it uniquely identifies this user.$88
  To install this user certificate,please save this e-mail message into the following file.

  /home/globus/.globus/usercert.pem

//-e后面可以跟多个命令,此处命令不是Linux命令,个人理解加上-e就会将后面的字符串识别为正则表达式这种命令来处理,
sed -e 's/Certificate/certificate/g;' test1.txt > test1_result.txt //此处即为将所有的Certificate替换为certificate,s代表search,g是尽可能多的匹配,有多少替换多少,test1.txt文本中的Certificate替换成certificate

sed -f sed文件 输入文件
sed文件即为多个命令,比如一次性处理多条命令可以使用sed -e,但是命令多了就需要使用多个sed -e '' -e '' .... 输入文件,我们可以将-e后面多个文件写入到sed文件中

cat sedfile
$ s/root/ROOT/
$ s/bin/BIN/
$ s/home/HOME/

然后执行如下命令可以进行操作
sed -f sedfile /etc/passwd

sed -e 's/root/ROOT/' -e 's/bin/BIN/' -e 's/home/HOME/' passwd
示例
cat passwd

sed -e 's/root/ROOT/' -e 's/bin/BIN/' -e 's/home/HOME/' passwd

cat sedfile
s/root/ROOT/
s/bin/BIN/
s/home/HOME/

s 文本替换操作
d 删除操作
i 插入操作
a 附加操作,即添加
c 将一行文本修改为新的行
y 逐字符替换
p 打印文本行
= 打印行号
w 向文件中写入数据
r 从文件中读取数据

s 文本替换操作
1)数字:指明替换掉第几次匹配到的文本,没有设置这个标记时,默认是替换第一次匹配的文本:
这行命令将 /passwd 文件中每行的第 2 个 root 替换为 ROOT;

2)g :替换所有匹配到的文本:
sed 's/root/ROOT/g' /etc/passwd
这行命令将 /etc/passwd 文件中的 root,全部替换为 ROOT;

3)p :打印与替换命令中指定模式(srcStr)相匹配的行:

sed 's/root/ROOT/p' /etc/passwd

执行这命令,会在 STDOUT 上看到包含有 root 的行被输出了两次,一次是 sed 编辑器自动输出的;另一次则是 p 标记打印出来的匹配行。

单独地使用 p 标记没什么用处,通常将 p 标记和 -n 选项结合起来使用,这样就可以只输出被匹配替换过的行了:

sed -n 's/root/ROOT/gp' /etc/passwd # 将 /etc/passwd 中所有的 root 都替换成 ROOT,并输出被修改的行


注:可以使用 " = " 命令来打印行号,用法与 p 一样。

4)w file :将替换的结果写到文件中,不过只保存被修改的行,与 -n + p 的功能类似:

sed -n 's/root/ROOT/g w change.txt' /etc/passwd # 将 /etc/passwd 中所有的 root 都替换成 ROOT,并将被修改的行保存到文件 change.txt 中去

使用数字方式进行行寻址

sed 编辑器将文本流中的每一行都进行编号,第一行的编号为 1 ,后面的按顺序分配行号。通过指定特定的行号,可以选择编辑特定的行
将第3行中所有的 bin 替换成 BIN
sed '3 s/bin/BIN/g' /etc/passwd

将第2到5行中所有的 bin 替换成 BIN
sed '2,5 s/bin/BIN/g' /etc/passwd

将第10行到最后一行中所有的 bin 替换成 BIN
sed '10,$ s/bin/BIN/g' /etc/passwd

使用文本模式过滤器过滤行

i/a
在数据流的第一行前面增加一个新行
sed '1i abcdefg' test1.txt

在数据流的第三行后面增加一个新行

sed '$a aaaaaaa' passwd # 在数据流的最后一行后面增加一个新行

将数据流中第三行的内容修改为 后面的内容
sed '3 cNew text' test1.txt

将匹配到 root 的行的内容修改为 后面的内容
sed '/root/ cNew text' passwd

sed '2,4cNew text' /etc/passwd # 将第2到4行的内容修改为 后面的内容,但是不是逐行修改,而是会将这之间的 3 行用一行文本来替代

源文件

替换后的文件

注意这里对地址区间使用 c 命令进行修改时,不会逐行修改,而是会将整个区间用一行修改文本替代

r 从文件中读取数据

sed '3 r test1.txt' passwd
可以使用 r 命令来将一个文本中的数据插入到数据流中去,与普通的插入命令 i 类似,这也是对行进行操作的,这句话将文件 test1.txt中的内容插入到数据流第三行后面去

w 向文件中写入数据

前面已经提到过,可以使用 w 命令向文件写入行

使用 sed 命令逐字符转换

使用 y 参数可以按要求对文本进行逐字符转换。格式如下:

[address]y/inchars/outchars/

转换命令会对 inchars 和 outchars 的值进行一对一的映射。inchars 中的第一个字符会被转换成 outchars 中的第一个字符;inchars 中的第二个字符会被转换成 outchars 中的第二个字符;... 直到处理完一行。如果 inchars 和 outchars 的长度不同,则 sed 编辑器会产生一个错误消息。举个例子:

echo abcdefggfedcba | sed 'y/acg/ACG/'

输出结果为 AbCdefGGfedCbA。

参考链接:
https://www.sohu.com/a/332023713_120047065

标签:cn,passwd,sed,edu,txt,root,详解
来源: https://www.cnblogs.com/nanblog/p/16470199.html