sed命令

1. 格式

sed 选项 sed命令 输入文件
sed -f script_file 输入文件 (从文件读取sed命令)
流程:

  1. 读取输入流的一行到模式空间。
  2. 对模式空间中的内容进行匹配和处理。
  3. 自动输出模式空间内容。
  4. 清空模式空间内容。
  5. 读取输入流的下一行到模式空间。
    注意: 3和4是一定会执行的, 只不过可以通过特殊选项控制其行为
    多行命令格式:
sed Address1{cmd1;cmd2;cmd3};Address2{cmd4;cmd5;cmd6}...
sed Address1,Address2{cmd1;cmd2;cmd3};
sed  -e 'Address1{cmd1;cmd2;cmd3}' -e 'Address2{cmd1;cmd2;cmd3}' 
2. 选项
选项说明
-n静默输出, 不打印内容
-e可通过-e指定要执行的多个命令
-f要执行的命令文件
-i[suffix]对源文件进行修改, 指定suffix会创建源文件的副本, 副本名为源文件名加suffix, suffix中带有*号时则直接把*号改为原文件名然后当做副本文件名
-r使用扩展正则表达式
-s将每个文件都当做独立的文件流(无法跨文件匹配,行号也会重置), -i选项隐含-s选项
3. 定址

匹配的过程称为定址。定址表达式有多种,但总的来说,其格式为ADDR1,ADDR2。这可以分为3种方式:

(1)ADDR1和ADDR2都省略时,表示所有行都能被匹配上。
(2)省略ADDR2时,表示只有被ADDR1表达式匹配上的行才符合条件。
(3)不省略ADDR2时,是范围地址。表示从ADDR1匹配成功的行开始,到ADDR2匹配成功的行结束。

无论是ADDR1还是ADDR2,都可以使用两种方式进行匹配:行号和正则表达式。
(1)‘N’: 行号匹配,除非使用-s选项, 行号将连续计数;
(2)‘M~N’: 从M行开始, 匹配满足M + nN(n>=0)的行;
(3)’$’: 匹配文件的最后一行, 注意, 只有在最后才生成, 无法当做变量使用;
(4)’/rex/’, ‘/rex/I’ :正则表达式匹配, 带I 表示不区分大小写;或者使用 ‘%rex%’ 也可以;
(5)‘ADDR1, +N’: 匹配ADDR1及其后面的N行;
(6)‘ADDR1, ~N’: 匹配ADDR1及其后面直到N行;
(7)在ADDR后加’!’: 表示反向匹配, 不匹配ADDR的行进行处理;

4. 常用命令

(1) 打印命令"p"
(2) 删除命令"d": 删除整个模式空间的内容, 然后读入下一行, d后面的命令不会再执行;
sed '/aaa/{1!d}' test.txt ???
(3) 退出sed程序: “q"和"Q”, 退出sed的执行, 处理大文件时有用, 区别为q会输出当前模式空间的内容再退出, Q会直接退出, 退出命令不支持地址范围, 可以指定退出码;
sed '3q 2' test.txt

(4) 打印行号"="

(5) 字符一一替换命令"y": 将字符进行一一替换, 前后长度必须相等;
sed 'y/aaa/AAA/' test.txt

(6) 手动读入下一行"n": 后续命令在下一行内容执行, 如果没有下一行, 退出sed程序, 后面命令不会执行;
echo -e "abc\ndef\nxyz" | sed '/abc/{n;=;p}'

(7) 替换命令"s": 将匹配到的内容替换为指定内容;
格式: s/rex/replacement/flags;
使用rex匹配行, 将匹配的内容替换为replacement内容, 通过flag来指定不同选项:
g: 全部替换, 不使用g,默认替换第一个, 还可以是数字N, 表示替换第N个被匹配的内容;
p: 输出替换后的模式空间中的内容;
i: 匹配时不区分大小写;
w a.txt: 将更改的行保存到另一文件中;
注意:
1.replacement可以使用"\N"(N为数字)表示括号分组匹配的第N个内容; & 符号表示匹配到的所有内容, 包括括号中的内容;
2. 斜杠可以用%代替, 或者#, ! ,@, |;
3. 使用分组匹配时括号需要转义(使用-r选项时不需要斜杠转义);

sed 's%&&\(.*\) ||\(.*\)%\&\&\2 ||\1%' a.sh 

a=111
sed 's/$a/123/' a.txt  # 变量替换

(8) 追加, 插入,修改: “a”, “i”, “c”: a表示追加,表示插入前面, c表示修改; 在输出流时临时改变流的内容(不管是否输出的是空流), 命令相关的内容是在内存中的, 不改变模式空间, 因此-n等选项不起作用; 注意c命令略有不同, c执行后直接进行下一行的处理, c后的命令不会执行;

sed '/158/{p;a\xyz         # 有大括号时的写法, 反斜杠后面为追加内容, 遇到引号或分号内容结束
;p}' test.txt

sed '/158/a xyz' test.txt   # 简单写法

sed '/158/a\xyz\n123'   # 多行写法

(9) 写命令"w": 表示将内容写入文件;
sed '1,2w aaa.txt' bbb.txt

(10) 多行模式命令"N", “P”, “D”: N表示读入下一行加入模式空间; P表示输出模式空间第一个换行符之前的内容; D表示删除模式空间第一个换行符之前的内容, 然后开始下一次script循环; 借助这几个命令可以实现窗口滑动???

(11) 保持空间(hold space): 除模式空间外的另一个空间, 用于暂时保存数据, 只有几个命令可以操作保持空间; (高级用法)
“h"命令:将当前模式空间中的内容覆盖到保持空间。
“H"命令:在保持空间的尾部加上一个换行符”\n”,并将当前模式空间的内容追加到保持空间的尾部。
“g"命令:将保持空间的内容覆盖到当前模式空间。
“G"命令:在模式空间的尾部加上一个换行符”\n”,并将当前保持空间的内容追加到模式空间的尾部。
"x"命令:交换模式空间和保持空间的内容。

sed '1!G;h;$!d' a.txt  # 倒序输出

(12) 行长度命令"l": 指定输出行长度, 同时会显示隐藏字符(不知道这个命令啥用)
sed 'l 25' a.txt

(13) 读取文件命令"r": 将文件内容读取出来然后加到某些行前面;
sed '3r test2.txt' test.txt

(14) 执行外部命令"e": 在sed中执行外部命令, 如果e后面没有命令, 那么把模式空间中的内容当命令执行;
sed '3e date' test.txt

5. 正则表达式特殊变量

(1) [:alnum:] 匹配字母和数字
echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'
(2) [:alpha:] 匹配字母
(3) [:blank:] 匹配空白字符
(4) [:digit:] 匹配数字
(5) [:lower:] 小写字母
(6) [:upper:] 大写字母
(7) [:punct:] 标点符号包括非空格或字母数字字符
(8) [:space:] 空格字符

6. 跳转命令b和t

(1) b: 跳转到指定标签之后或之前, 执行标签后或前的剩余命令, 不指定标签则直接跳到脚本结尾, 标签格式为 :label

[root@localhost ~]# sed '{/first/b jump1 ; s/This is the/No jump on/
> :jump1
> s/This is the/Jump here on/}' data2.txt
No jump on header line
Jump here on first data line
No jump on second data line
No jump on last line

[root@localhost ~]# echo "This, is, a, test, to, remove, commas." | sed -n '{
> :start
> s/,//1p
> /,/b start
> }'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.

(2) t命令: t 测试命令会根据 s 替换命令的结果,如果匹配并替换成功,则脚本的执行会跳转到指定的标签;反之,t 命令无效。

[root@localhost ~]# sed '{
> s/first/matched/
> t
> s/This is the/No match on/
> }' data2.txt
No match on header line
This is the matched data line
No match on second data line
No match on last line


[root@localhost ~]#  echo "This, is, a, test, to, remove, commas. " | sed -n '{
> :start
> s/,//1p
> t start
> }'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值