ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sed详解

2022-07-12 15:35:50  阅读:240  来源: 互联网

标签:cn passwd sed edu txt root 详解


行匹配
-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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有