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 -n '/238.223.212.171/,$p' 1.txt
打印238.223.212.171 所在行到最后一行
sed -n '1,/118.123.13.175/p' 1.txt
打印1一行到匹配到175所在行
sed -n '2,5{=;p}' 1.txt
输出2,5行内容并且输出行号,当有多个命令时使用{},且命令之间使用;隔开
sed -n '2,5!{=;p}' 1.txt 代表取反
sed -e '/^#/d' -e '/^$/d' /etc/my.cnf
sed -n '/^#/!{/^$/!p}' /etc/my.cnf
删除#开头的行和空格行
sed -n '/\<nginx\>/p' /usr/local/nginx/nginx.conf
sed -n '/nginx/s/^/测试 /p' /usr/local/nginx/nginx.conf
sed -n 's/root/测试 &/p' /etc/passwd
sed -n 's/root/& 测试/p' /etc/passwd
sed -n '/root/s/$/ LI/p' /etc/passwd
sed -n '/root/s/\(.*\)/\1 LI/p' /etc/passwd
» 本文链接地址:https://blog.mydns.vip/2059.html
最新评论
麻烦发下检测工具
让我下载
非常好