概述
sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作。sed是按行来处理文本内容的。在shell中,使用sed来批量修改文本内容是非常方便的。


sed命令的选项
语法:sed [选项] [动作]

选项与参数:


function:


一般function的前面会有一个地址的限制,例如 [地址]function,表示我们的动作要操作的行。

删除行
//test.txt 内容如下


sed '1,2d' test.xx 
输出:


其中1,2d中的d表示删除,而d前面的表示删除的行的地址,而1,2表示一个地址范围,也就是删除第1行和第2行。地址范围的表示一般是 m,n 表示对m和n行之间的所有行进行操作,也包含第m行和第n行。

新增行
sed '1a hello world' test.txt
输出:


其中a命令表示在指定行的后面附加一行,1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如果a的前面没有地址限定则在所有行的后面都会添加指定的字符串

sed '1i hello world' test.txt
输出:


命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串

替换行
sed '1c hello world' test.txt
输出:


命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面,例如:

sed '/^2/c hello world' test.txt
输出:


替换以2开头的行,其内容是c命令后面的字符串

替换部分字符串而不是整行
sed中除了上面的命令是针对整行进行操作的之外,还提供一个替换命令,该命令对某一行中的部分字符串进行操作,下面举一个简单的例子,还是同样的文本内容,执行下面的命令:

sed 's/aa/AA/' test.txt
输出:


s命令后面接的3个斜杠分隔的两串字符串,其含义是 s/待替换的字符串/新字符串/ 也就是说使用后面的 AA 替换文件中出现的前面的 aa 。实际上这里的替换仅仅替换每一行遇到的第一个aa,

将修改应用到文件中
我们之前做的所有实验,实际上都没有修改test.txt文件的内容,也就是说我们看到的修改结果仅仅输出到控制台上,而文件test.txt的内容是没有修改的,我们可以使用 -i 选项告诉sed直接修改文件的内容,而不是将修改结果输出到终端上,例如:

sed -i '2d' test.txt 
命令运行之后,我们发现test.txt的第2行没有了

sed正则中的元字符
我们知道sed中的命令前面可以使用地址范围进行限制,表示对文件的某些符合条件的行执行相应的操作,其中我们可以使用正则表达式选出要操作的行,而sed中正则的语法可能与我们其他命令的正则语法有一些不同,这里我们有必要列出sed中常用的正则元字符:

$ 表示行尾 ^ 表示行首[a-z0-9]表示字符范围[^]表示除了字符集中的字符以外的字符 sed的正则中 () 和 {m,n} 需要转义 . 表示任意字符 * 表示零个或者多个 + 一次或多次 ? 零次或一次 | 表示或语法
篇幅有限,关于sed命令就介绍到这了,建议大家多敲熟悉一下。后面小编会分享更多运维干货,感兴趣的朋友走一波关注哩~
————————————————
版权声明:本文为CSDN博主「陆牙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_28677451/article/details/112175057

sed查找文件包含字段_sed搜索并替换包含/ 的字符串


不要逃避反斜杠; 你会迷惑自己。s在文本中没有出现的命令后使用不同的符号(我%在下面的示例中使用):

line_old='myparam /path/to/a argB=/path/to/B xo'

line_new='myparam /path/to/c argB=/path/to/D xo'

sed -i "s%$line_old%$line_new%g" /etc/myconfig

另外,用双引号括起整个字符串; 使用单引号意味着sed看到$line(在原始中)而不是扩展值。在单引号内,没有扩展,也没有元字符。如果您的文本几乎可以包含任何纯文本字符,请使用控制字符(例如control-A或control-G)作为分隔符。

请注意,-i这里的使用反映了问题中的内容,但假定使用GNU sed。BSD sed(在Mac OS X上也可以找到)需要后缀。你可以用sed -i '' …原位替换; 这与GNU不兼容sed。要在两者之间携带,请使用-i.bak; 这将适用于两者 - 但为您提供了一个您可能想要删除的备份文件。其他Unix平台(例如AIX,HP-UX,Solaris)可能具有sed根本不支持的变体-i。POSIX规范不要求它sed。
————————————————
版权声明:本文为CSDN博主「weixin_39734458」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39734458/article/details/111491078

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐