shell-08-三剑客-sed

举报
kaliarch 发表于 2021/12/11 13:32:11 2021/12/11
【摘要】 一、概念:sed是一种流编辑的文本处理工具,工作模式:将当前处理的行存储在临时缓冲区(模式空间),对缓冲区中的内容利用制定的动作进行处理,完成后输出到屏幕,接着反复重复执行此操作完成整改文件的处理。 二、适用场景大文件有规律的文本 三、语法sed [option] ‘Addresscommand’ [file …]选项 * -n:安静模式,仅显示script处理后的结果,不再默认显示...

一、概念:

sed是一种流编辑的文本处理工具,

  • 工作模式:将当前处理的行存储在临时缓冲区(模式空间),对缓冲区中的内容利用制定的动作进行处理,完成后输出到屏幕,接着反复重复执行此操作完成整改文件的处理。

二、适用场景

  • 大文件
  • 有规律的文本

三、语法

sed [option] ‘Addresscommand’ [file …]

  • 选项
    * -n:安静模式,仅显示script处理后的结果,不再默认显示模式空间中的内容 
    * -e:<script>--expression=<script> 以选项中指定的script来处理输入的文本文件,可以同时执行多个脚本
    * -f:对制定的文件直接进行sed的command操作
    * -i:直接修改原文件
    * -r:支持扩展正则表达式
```

* 地址定界
* 
```
    * startline,endline
    * /regexp/
    * /pattern1/,/pattern2/:第一次被pattern1匹配到的行开始,直到被pattern2匹配到的行结束
    * linenuber:制定行号
    * startline,+n,从startline开始,向后n行结束
    * startline~step:步长,每隔step步
```


* 命令操作

```
    * d: 删除符合条件的行; 
    * p: 显示符合条件的行; 
    * a \string: 在制定或匹配到的行后面追加新行,内容为string 
    * \n:可以用于换行 
    * i \string: 在制定或匹配到的行前面添加新行,内容为string 
    * s:s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串 
```

* 加修饰符 

```
    * g: 全局替换 
    * i: 忽略字符大小写 
```

* 匹配元字符:

    ```
    ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
    $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
    . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
    * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
    [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。  
    [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
    \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
    & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
    \< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
    \> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
    x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含50的行。
    x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有50的行。
    x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~100的行。
    ```
    

eg:

```
1、删除/etc/grub.conf文件中行首的空白符;
sed -r 's/^[[:space:]]+//g' /etc/grub.conf
2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5's/id:[0-9]/id:5/g' /etc/inittab
3、删除/etc/inittab文件中注释行:
sed '/^#/d' /etc/inittab
4、取消/etc/inittab文件中开头的#号;
sed 's/^#//g' /etc/inittab 
5、打印文件/etc/services匹配blp5开头的行
sed -n '/^blp5/p' /etc/services
6、打印2-5行
sed -n '2,5p' /etc/services
7、打印奇数行
seq 10 |sed -n '1~2p'
8、打印最后一行
sed '$p' /etc/services
9、给.at的单词添加双引号
echo "The cat sleeps in his hat" | sed 's/.at/"&"/g'

```

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。