linux命令之sed
sed : Stream Editor文本流编
sed [-efhniV] [acdips]
sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。
参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
-i 在原文件中修改,不用使用重定向文件流操作即可生效。
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! g是global 的意思,表示一行中,可以执行多次. Ng 表示第几次出现才替换,默认的话,第一次进行操作,其他忽略
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
在执行的动作部分,格式一般如下。
匹配的行, 要执行的动作,要执行动作的参数, 文件
行数的特殊表示法: $:行尾;^:行首; 这个代表的行尾和行首的概念,并不是实体。
内容的特殊表示法:&:匹配到的单词;代表的 匹配到的字符串,是实体。
匹配的行的具体表现
x : x为行号
x,y : 表示行号从x到y
/pattern : 查询包含模式的行
/pattern /pattern : 查询包含两个模式的行
pattern/,x : 在给定行号上查询包含模式的行
x,/pattern/ :通过行号和模式查询匹配的行
x,y! : 查询不包含指定行号x和y的行
可以包含的正则表达式 扩展正则表达式 需要使用 -r 选项
^ 锚点行首的符合条件的内容,用法格式"^pattern"
$ 锚点行首的符合条件的内容,用法格式"pattern$"
^$ 空白行
. 匹配任意单个字符
- 匹配紧挨在前面的字符任意次(0,1,多次)
.* 匹配任意长度的任意字符
\? 匹配紧挨在前面的字符0次或1次
{m,n} 匹配其前面的字符至少m次,至多n次
{m,} 匹配其前面的字符至少m次
{m} 精确匹配前面的m次{0,n}:0到n次
< 锚点词首----相当于 \b,用法格式:<pattern
> 锚点词尾,用法格式:>pattern
<pattern> 单词锚点
分组,用法格式:pattern,引用\1,\2
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:digit:] 所有数字, 相当于0-9, [0-9]---> [[:digit:]]
[:lower:] 所有的小写字母
[:upper:] 所有的大写字母
[:alpha:] 所有的字母
[:alnum:] 相当于0-9a-zA-Z
[:space:] 空白字符
[:punct:] : 所有标点符号
命令参数参考
p 打印匹配行(和-n选项一起合用)
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d 删除定位行
c\ 用新文本替换定位文本
w filename 写文本到一个文件,类似输出重定向 >
r filename 从另一个文件中读文本,类似输入重定向 <
s 使用替换模式替换相应模式
q 第一个模式匹配完成后退出或立即退出
l 显示与八进制ACSII代码等价的控制符
{} 在定位行执行的命令组,用分号隔开
n 从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理
N 在数据流中添加下一行以创建用于处理的多行组
g 将模式2粘贴到/pattern n/
y 传送字符,替换单个字符
经典案例以及解析
以行为单位 进行删除,添加 (aid)
sed -n '1,2d'
sed -n '3,$d'
sed -e '1a hello wolrd' 或者 sed -n 1ahello wolrd 或者 sed -n '1a\hello wolrd' 就是如果动作和内容之间有空格,那么必须添加 单引号
sed -e '1ihelloworld' 在之前添加
sed -e '2,4ihello' 每一行都添加
sed -i '/特定字符串/i 新行字符串' file 特定字符串的行前插入新行
sed -i '/特定字符串/a 新行字符串' file 特定字符串的行后插入新行
i:在之前添加,a:在之后添加
以 行为单位 替换
sed -e '2,6chello' a.txt : 把 2-5 行,替换为 hello
sed -n '2,5p' 打印 2-5 行
sed '4a \ ' 添加一个存在一个空格的空行
sed '4 a \' 可以添加一个完全为空的空行
sed '4 a \n' 可以添加两个完全为空的空行
数据的匹配 并展示/删除
sed -e /root/d
sed -e /root/p
打印活着删除 匹配到的内容
数据的搜寻并执行命令
sed -n '/root/{s/bash/blueshell/;p;q}'
搜索到匹配 root 的行,之后将 /bash/shell 替换为 blueshell 仅仅执行一次,同时打印,之后退出。
数据的搜寻并替换
以行为单位 进行操作,对指定字符串进行替换
sed 's/要被取代的字串/新的字串/g'
多点编辑
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
也即,执行多条命了, -e 选项开启操作
直接修改文件内容本身
sed -i 's/.$/!/g' regular_express.txt
如果最后一行内容为 . 的话,那么将其替换为 !
对于特殊标示 要进行 转义的操作
sed -i ‘$a # this is a comment’
最后一行 添加注释
打印匹配到的行
sed '2p' 打印第二行
sed -n '1,2p' 打印 1-2 行
sed -n '/last/p' 打印匹配到 last 的行
sed -n '/first/,4p' 打印匹配到 first 到 4 行,如果first 处于第四行之后,那么只打印 第四行
sed -n '4,/last/p' 打印从第四行开始,到 匹配到 last 结束, 如果last 在第四行之后,没有匹配到,那么从 第四行 匹配到最后
sed -n '/data/,/last/p' 打印,匹配 data, last 的行
sed -n '1,2!{=,p}' 打印 除 1,2 行 之外的其他行,同时打印行号。 ! 表示取反
sed命令可以实现的添加
匹配行的行首添加,添加在同行 sed '/hello/s/^/hello /'
匹配行的行中的某个字符后添加 sed 's/hello/& wordEnd/'
匹配行的行尾添加字符 sed 'hello/s/$/ end'。 或者。sed -r 'hello/s/(.)/\1 end' (.) 表示一个正则分组, \1 表示引用第几分组, -r 使用正则扩展特性
匹配行的行前面行添加 sed 'hello/i\hello world'
匹配行的行后面行添加 sed 'hello/a\hello world'
文件的行首添加一行 sed -e '1i\hello world'
文件的行尾追加一行 sed -e '$a\hello world'
总结一下,如果需要操作的是 匹配行的行首,行尾,行前,行后,那么使用 /匹配内容/动作/参数/ 的格式 例如 /hello/s/^/hello / 表示,在匹配行的行首添加 hello
如果要操作的是 匹配行中中匹配内容的 前后的话,使用 动作/匹配内容/添加内容 &/ 的格式,一般用 & 来代表 匹配到的内容。
高级用法:
sed引用变量:(在自动化shell脚本 中也经常会使用到变量)
第一种当sed命令里面没有默认的变量时可以把单引号改成双引号;
第二种当sed命令里面有默认的变量时,那自己定义的变量需要加单引号,且sed里面的语句必须用单引
把正在用sed操作的文件的内容写到例外一个文件中
sed -i 's/IPADDR/ip/w ip.txt' test
把sed操作的文件内容保存到另外一个文件中,w表示保存,ip.txt文件名
读取一个文件到正在用sed操作的文件中
sed -i '/Ethernet/r myfile' test
在匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后
参考资料
https://www.runoob.com/linux/linux-comm-sed.html
https://www.cnblogs.com/ev-zhk/p/4277023.html
https://www.cnblogs.com/ctaixw/p/5860221.html
https://www.cnblogs.com/super119/archive/2010/12/10/1902033.html
https://www.cnblogs.com/super119/archive/2010/12/10/1902033.html