sed - 文本三剑客之编辑功能
sed - stream editor for filtering and transforming text
Sed是一个流编辑器。流编辑器用于对输入流(文件或管道输入)执行基本的文本转换。虽然在某些方面类似于允许脚本编辑的编辑器(如ed),但sed的工作方式是只对输入进行一次传递,因此效率更高。但是sed能够过滤管道中的文本,这一点与其他类型的编辑器有很大的区别。
一次处理一行内容,在处理时,把当前处理的行存储在临时缓冲区中当中,该缓冲区称为模式空间(Pattern space),接着用sed命令处理缓冲区中的内容,处理完毕后,把缓冲区的内容送到标准输出;然后紧接着去处理下一行,重复完成相同的操作,直至文件未尾;sed处理的整个过程中,对象文件中的内容并没有改变,除非使用重定向来存储处理后的结果,sed主要用来自动编辑一个或多个文件,简化对文件的反复操作过程。默认不编辑原文件,仅对模式空间中的数据进行处理
**格式:**
`sed [option] ... '[address-range][script]' inputfile...`
常用选项:
- -n:不输出模式中的内容至屏幕
- -e:多点编辑
- -r:支持扩展正则表达式
- -f /path/to/sript_file:从指定文件中读取编辑脚本
- -i:原处编辑
**地址定界(address-range):**
1. 不给定地址,默认将对全文进行处理
2. 单地址:
* \#:指定的行
* /pattern/:被此模式匹配的每一行
* $:最后一行,$-1就是倒数第二行
3. 地址范围:
* \#,#:1,3第一行到第三行
* \#,+#:1,+2第一行到1+2=3行
* /pattern1/,/pattern2/:从第一个匹配到pattern1到第一个匹配pattern2的中间所有行
* \#,/pattern/:从第多少行到第一个匹配pattern的行中间所有行
pattern
支持正则表达式方法。
**编辑命令:**
* d:删除
* p:显示模式空间的内容
* c \test:将选定的行替换为文本
* a \test:在行后面追加文本,支持使用\n实现多行追加
* i \test:在行前面追加文本,支持使用\n实现多行追加
* r /path/to/somefile:读取指定文件的文本流至模式空间中匹配的行的行后
* w /path/to/somefile:保存模式空间匹配到的行至指定文件中
* =:为模式空间中行打印行号
* !:取反条件,写于位置后
* s/// s@pattern@replace@ s### //如果pattern和replace中有的字符与分隔符(s后的和一个字符)相同,即可用\转义,也可将修改成不同的分隔符(如!@#$%^&*),这样阅读起来方便些,避免不必要的错误。
替换标记:
- g:行内全局替换`s@@@g`。不加g默认只替换每行中第一次被匹配到的串
- i:忽略字符大小写`s@@@i`
注:这里的a
,c
,i
,r
,w
参数都是另起一行追加,并不是在原有行首或行尾追加。
**示例:**
```
[root@node1 tmp]# echo first | sed '1p' #sed默认是将模式空间的内容输出至屏幕,同时又用p选项输出,所以就会输出两次
first
first
[root@node1 tmp]# echo first | sed -n '1p' #使用-n选项就只输出想要的行,而不是把模式空间中的内容输出
first
[root@node1 tmp]# echo -e "222\n222"| sed 's/2/1/' #懒惰
122
122
[root@node1 tmp]# echo -e "222\n222"| sed 's/2/1/g' #如果编辑命令后不加g,默认只修改每一行中第一个匹配的值,加上g则表示全局修改(勤奋)
111
111
[root@node1 tmp]# cat a.sh
1
end1
2
end2
3
end3
4
end4
[root@node1 tmp]# sed -n '/1/,/end/p' a.sh
1
end1
[root@node1 tmp]# sed -n '1,/end/p' a.sh #位置匹配是懒惰的,只匹配第一次匹配到的位置
1
end1
[root@node1 tmp]# echo -e "222"| sed 's/2/[&]/g' #可以使用&符号代替匹配到的内容,然后在其前后增加中括号
[2][2][2]
[root@node1 tmp]# echo -e "222"| sed -e 's/2/1/g' -e 's/1/3/' #多个匹配
311
> sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:
$ name=walter
$ echo 'my name is $name' | sed "s@$name@$name@"
my name is walter
<br />
**1.**删除grub的启动项文件中所有以空白开头的行行首的空白字符
sed 's/[1]*//' /etc/grub2.cfg
sed 's/[[:space:]]+//' /etc/grub2.cfg
**2.**echo一个绝对路径给sed命令,取出其基名,取出其目录名。
echo /etc/sysconfig/network-scripts/ | sed -r 's@(/./)[^/]+/?@\1@' 目录名
echo /etc/sysconfig/network-scripts/ | sed -r 's@/./([^/]+)/?@\1@' 基名
**3.**删除某一行
sed -i '/xxx/d' a.sh
**4.**注释10-20
sed -i '10,20s@^@#@g' xxx.sh
**关键知识:**
圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,使用方式\1,\2..,按照括号从左到右的顺序给定变量名称
[root@node1 tmp]# echo -e "121"| sed -r 's@(12)@\13@g' #在匹配的后面加值
1231
[root@node1 tmp]# echo -e "121"| sed -r 's@1(12)@\13@g' #这个是匹配失败,返回原来的值,匹配不到112
121
[root@node1 tmp]# echo "12 21" | sed -r 's@(\w\w)\s?(\w*\w)@\1=\2@' #\1是12,\2是21
12=2*1
$ echo 'this is en example' | sed -E 's@(\w+)@[\1]@g'
[this] [is] [en] [example]
<br />
**总结:**
`sed`命令按行编辑,拥有pattern space和hold space两种模式空间,日常所用也就pattern space,但是hold space个人觉得就像是汉诺塔一样有第三个柱子,就多出了很多种玩法了。pattern space就相当于只有两个柱子,玩法自然就少了。`vim`文本编辑器里的替换功能和`sed`命令语法一致。所以需要熟练掌握。
<br />
**hold space高级玩法资料:**
[https://www.cnblogs.com/fhefh/archive/2011/11/22/2259097.html](https://www.cnblogs.com/fhefh/archive/2011/11/22/2259097.html)
[:space:] ↩︎
sed - 文本三剑客之编辑功能的更多相关文章
- Linux文本三剑客超详细教程---grep、sed、awk
awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单 ...
- linux基础—课堂随笔05_文本三剑客之SED
1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...
- 6.文本三剑客之sed
文本三剑客之sed 目录 文本三剑客之sed sed编辑器 sed概述 sed工作流程 sed用法 sed打印 sed删除 sed替换 sed增加行内容 sed剪切粘贴与复制粘贴 sed字符/字符串交 ...
- 使用springmvc,jsp,结合网页文本编辑器kindEditor实现基本博客编辑功能
kindEditor官网:http://kindeditor.net/demo.php 个人实践: 为了在自己的项目中引入一个类似用户写博客的功能,在网上找到了kindeditor,真心又好又易用. ...
- Linux - sed 文本操作
SED 是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大. sed全称是:Stream EDitor 调用sed命令有两种 ...
- 3.2.1 配置构建Angular应用——简单的笔记存储应用——编辑功能
本节我们会接着上节课的内容,继续来完成使用Angular来创建简单的笔记存储应用,上一节课,我们完成了笔记的展示功能,本节课,我们来完成编辑功能. 编辑主要是两个功能:编辑现有的笔记以及创建新笔记.首 ...
- ABBYY FineReader 15 PDF文档编辑功能详解
ABBYY FineReader 15(Windows系统)OCR文字识别软件作为一款通用 PDF 工具,能轻松有效地对各种 PDF文档和纸质文档,进行数字化.检索.编辑.转换.包含.分享和合作,而其 ...
- Sublime Text 2 强大的编辑功能
多行编辑功能:1) 同时编辑多行 (Ctrl+Shift+L (Win) 或 Command+Shift+L (Mac))如要在选中的多行文本的最后面同时添加一个字符"a",先选 ...
- 实现表单input文本框不可编辑的三种方法
感谢原文作者:青灯夜游 原文链接:https://www.php.cn/div-tutorial-413133.html 目录 问题 实现方式 1.οnfοcus=this.blur() 2.read ...
随机推荐
- html 指定页面字符集的两种方式
1.html指定页面字符集的两种方式 方式一: <meta charset="utf-8"> 方式二: <meta http-equiv="Cont ...
- Qt应用程序主窗口之二:拖放操作与打印文档
一.拖放操作 对于一个实用的应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动直接将桌面上的文件拖入程序界面上来打开,就像可以将.pro文件拖入Creator中来打开整个项目一样.Qt中 ...
- Arcmap图层浏览遇到ORA-07445 [QCDLAUCN] 错误
Oracle 12.1.0.2版本,在图层浏览时遇到了ORA-07445 [QCDLAUCN] 错误.根据MOS的查询结果,得知这是一个bug (Doc ID 1932725.1): 文章中同时给出了 ...
- Unary模式下客户端创建 default-executor 和 resolver-executor 线程和从启动到执行grpc_connector_connect的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient 创建 default-executor 和 resolver-executor 线程 ...
- 最细的eclipse 安装maven踩过的坑
Eclipse安装maven插件踩过的坑 在线安装maven eclipse安装maven插件,在网上有各种各样的方法,博主使用过的也不止一种,但是留下的印象总是时好时不好,同样的方法也不确定那一次能 ...
- docker搭建MediaWiki
一.简介 MediaWiki 是 Wikipedia 使用的网站解决方案的开源版,以个人观点来看,Wiki 在这个时代显得不够时尚,且不支持 MarkDown 等新兴的标记语言,另外页面的组织方式采用 ...
- 记:使用IScroll.js 开发picker日历组件遇到的问题及经验总结
IScroll中文文档 第一个问题: 边界留白 就是这种,上边界(最小),下边界(最大)有两个列表的位置是不能选择的.解决的办法是: 在HTML中,添加空白节点就行了. 第二个问题:初始化之后的滚动停 ...
- 【题解】Luogu P5468 [NOI2019]回家路线
原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...
- 【题解】古代猪文 [SDOI2010] [BZOJ1951] [P2480]
[题解]古代猪文 [SDOI2010] [BZOJ1951] [P2480] 在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心 ...
- golang学习笔记 ---interface
1. 什么是interface接口 interface 是GO语言的基础特性之一.可以理解为一种类型的规范或者约定.它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“im ...