没有所谓的捷径
一切都是时间最平凡的累积

sed命令详解

sed命令详解

1、sed工作原理

sed工作的过程是先从文件中读取一行内容到模式空间里即sed专属的缓存空间,然后判断这行内容是否是需要处理的内容,如果不是就继续从文件中读取下一行,否则对改行内容进行相应处理后输出,然后继续读取下一行进行判断或处理,直到文件最后一行处理完毕整个过程结束。

2、sed命令使用说明

sed命令格式如下:

sed  参数  功能选项  文件名或其他标准输入

常用参数:

  • -n 安静模式 不打印输出
  • -e 增加一个执行脚本
  • -f 将脚本文件的内容添加到要执行的命令中
  • -i 编辑文件(如果提供后缀,则进行备份)
  • -c 在-i模式下整理文件时使用copy而不是rename
  • -r 在脚本中使用扩展正则表达式
  • -u 从输入文件加载最少数量的数据,并更频繁地刷新输出缓冲区

动作说明:

  • d 删除指定行
  • a 新增 在定位行后面增加信息
  • c 替换,用新文本替换指定文本
  • i 插入 i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
  • p 打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
  • s 使用替换模式替换指定字符
  • w file 写并追加模板块到file末尾,类似输出重定向 >
  • r filename 从另一个文件中读文本,类似输入重定向 <
  • = 打印当前行号
  • q 退出sed

补充:
a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
D 删除模板块的第一行。
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。

相关元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
/sed匹配行结束,如:/sed/匹配所有以sed结尾的行。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
\ (..\) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
\< 匹配单词的开始,如:/\ 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。

sed指定操作行的格式有以下几种:

10             匹配第十行
10,20                匹配第十行到第二十行
10,+20            匹配第十行到第三十行(10+20)
1~2              匹配第一行开始的奇数行
10,$             匹配第十行到最后一行
/oldboy/             匹配有oldboy的行
/oldboy/,/Alex/        匹配有oldboy的行到有Alex的行
/oldboy/,$          匹配有oldboy的行到最后一行
/oldboy/,10           匹配有oldboy的行到第十行,如果前十行没有匹配到有oldboy的行会对后面匹配到有oldboy的行进行操作
1,/Alex/           匹配第一行到有Alex的行
/oldboy/,+2           匹配有oldboy的行及之后的两行

sed的特殊操作:

\1:反斜杠接数字是sed配合正则的分组匹配的特殊技巧名为后项引用,sed命令在使用正则匹配时会记住圆括号即分组匹配匹配到的内容,使用反斜杠接数字的方式即可取出对应顺序被sed记住的内容,需要注意的是sed最多只能记住九个分组匹配的内容,也就是说反斜杠后面能接的最大的数字是九。

&:在sed匹配中这个符号表示前面需要被替换掉的内容。

sed整行替换指定字符

sed -i '/^GATEWAY/c\GATEWAY=103.139.0.1' /etc/sysconfig/network

搜索GATEWAY开头的字符,整行替换为GATEWAY=103.139.0.1,c参数就是替换旧行

全面替换g

sed 's/home/a/g' file
echo aaaaaa | sed 's/a/A/2g' 
aAAAAA 
echo aaaaaa | sed 's/a/A/3g' 
aaAAAA 
echo aaaaaa | sed 's/a/A/4g' 
aaaAAA

d 删除命令

删除空白行: sed '/^$/d' file 
删除文件的第2行: sed '2d' file
删除文件的第2行到末尾所有行:sed '2,$d' file
删除文件最后一行:sed '$d' file
删除文件中所有开头是test的行: sed '/^test/'d file

已匹配字符串标记&

正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:
echo this is a test line | sed 's/\w\+/[&]/g'
 [this] [is] [a] [test] [line] 
 所有以192.168.0.1开头的行都会被替换成它自已加localhost:
 sed 's/^192.168.0.1/&localhost/'
 file 192.168.0.1localhost

词组精确匹配

sed -i 's/\<n\>/en/g' text.txt #精确匹配独立词组n,替换为en

用法实例:

sed '/root/p' /etc/passwd
打印匹配到root的行,匹配后默认会显示文件中的所有行,-n只显示匹配行
sed命令详解
sed -n '/238.223.212.171/,$p' 1.txt
打印238.223.212.171 所在行到最后一行
sed命令详解
sed -n '1,/118.123.13.175/p' 1.txt
打印1一行到匹配到175所在行
sed命令详解
sed -n '2,5{=;p}' 1.txt
输出2,5行内容并且输出行号,当有多个命令时使用{},且命令之间使用;隔开
sed -n '2,5!{=;p}' 1.txt 代表取反
sed命令详解
sed -e '/^#/d' -e '/^$/d' /etc/my.cnf
sed -n '/^#/!{/^$/!p}' /etc/my.cnf
删除#开头的行和空格行
sed命令详解
sed命令详解
注意-i 是参数代表插入修改文件
i\end是动作,代表在匹配行的前面添加
sed -n '/\<nginx\>/p' /usr/local/nginx/nginx.conf
sed命令详解
打印含有nginx的行,注意<单词>这个是单词锚点
sed -n '/nginx/s/^/测试 /p' /usr/local/nginx/nginx.conf
sed命令详解
匹配nginx行,并在行首添加“测试”
sed -n 's/root/测试 &/p' /etc/passwd
sed -n 's/root/& 测试/p' /etc/passwd
sed命令详解
匹配root并在行首添加测试两个字
sed -n '/root/s/$/ LI/p' /etc/passwd
sed命令详解
匹配root并在行尾添加li
sed -n '/root/s/\(.*\)/\1 LI/p' /etc/passwd
sed命令详解

 

» 转载请保留出处:豫章小站 » 《sed命令详解》
» 本文链接地址:https://blog.mydns.vip/2059.html
» 如果喜欢可以: 点此订阅本站
赞(0) 打赏
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除,联系邮箱:contact@mydns.vip。文章观点不代表本站立场。本站原创内容未经允许不得转载,或转载时需注明出处:豫章小站 » sed命令详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

智慧源于勤奋,伟大出自平凡

没有所谓的捷径,一切都是时间最平凡的累积,今天所做的努力都是在为明天积蓄力量

联系我们赞助我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏