sed笔记
2024-10-16 08:17:56
sed是stream editor缩写,表示流编辑器,它是一款文本处理工具,可以配合正则表达式进行文本替换。
1、使用正则表达式匹配并进行文本中的字符串替换
*使用-i选项可以直接将替换结果应用到源文件而不用重定向到其他新文本。
*sed 's/pattern/replace_string/' file.txt会将文本中第一次出现的pattern替换为replace_string。若要对全文本应用次替换,需要在命令尾部加上g参数,即sed 's/pattern/replace_string/g' file.txt,若要从第N次开始替换,可以使用Ng即为,即sed 's/pattern/replace_string/Ng' file.txt。如:
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/4g'
patternpatternpatternPATTERN
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/3g'
patternpatternPATTERNPATTERN
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/2g'
patternPATTERNPATTERNPATTERN
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's/pattern/PATTERN/g'
PATTERNPATTERNPATTERNPATTERN
*字符/在sed中作为定界符使用,但是我们可以使用任意的定界符(如果所使用的定界符出现在所要匹配的样式内部,则需要用\进行转义),如下:
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's#pattern#PATTERN#g'
PATTERNPATTERNPATTERNPATTERN
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's*pattern*PATTERN*g'
PATTERNPATTERNPATTERNPATTERN
[root@RHEL-6 ~]# echo "patternpatternpatternpattern" | sed 's^pattern^PATTERN^g'
PATTERNPATTERNPATTERNPATTERN
2、常用技巧:
#移除空白行:sed '/^$/d' file.txt (/pattern/d会移除匹配样式的行,在空白行中,行尾标记紧随着行首标记)
[root@CentOS-6 testdir]# cat test
max
maxtrix
010-12345678 IPADDR: 192.168.0.1
0.0.0.0
[root@CentOS-6 testdir]# sed '/^$/d' test
max
maxtrix
010-12345678
IPADDR: 192.168.0.1
0.0.0.0
[root@CentOS-6 testdir]#
#已匹配字符串标记&:在sed中,用&标记被匹配的字符串,可在替换字符串时使用:
[root@CentOS-6 testdir]# echo "this is test" | sed 's/\w\+/[&]/g'
[this] [is] [test]
#子串匹配标记\1、\2等:&代表匹配给定样式的字符串,但是sed可以匹配给定样式的其中一部分,如:
[root@CentOS-6 testdir]# echo "hao ni" | sed 's/\([a-z]\+\) \([a-z]\+\)/\2 \1/'
ni hao
[root@CentOS-6 testdir]# echo "I am number 7" | sed 's/number \([0-9]\)/\1/'
I am 7
第一个例子中,使用相同的样式分别匹配了hao(子串1,表示为\1)和ni(子串2,表示为\2),在替换的时候两个匹配的子串调换位置,所以结果为“ni hao”,第二个例子中。number [0-9]匹配了number 7,其中7为匹配字符串,是第一个子串,替换中为\1即将number 7替换为第一个子串
#组合多个表达式:多个替换可以用管道符来处理,也可以在同一个sed命令中用“;”分隔,如下:
[root@CentOS-6 testdir]# echo "nice too meet you" | sed 's/n/N/' | sed 's/too/to/'
Nice to meet you
[root@CentOS-6 testdir]# echo "nice too meet you" | sed 's/n/N/;s/too/to/'
Nice to meet you
#引用:sed表达式通常用单引号来引用,不过也可以使用双引号。双引号会通过对表达式求值来进行扩展。当我们想在表达式中使用一些变量字符串时,双引号就有用武之地了:
[root@CentOS-6 testdir]# ojb=LYNUX
[root@CentOS-6 testdir]# echo "hello lynux" | sed "s/lynux/$obj/"
hello LYNUX
最新文章
- spring mvc生成注册验证码
- oracle迁移postgres之-Ora2Pg
- tomcat 解决端口8080冲突
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
- netty概念
- 【Todo】Nginx架构学习
- Atomikos 中文说明文档【转】
- 将vs2012建的项目转换为vs2010项目
- [深入React] 8.refs
- 关于android 双击事件
- .net MVC AutoFac基地的环境建设
- javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)
- Docker 网络命令
- 遭遇ASP.NET的Request is not available in this context
- 获取子元素节点(children,childNodes)
- d2-admin中那些不错的技巧
- Mac idea 执行testng用例,提示%MODULE_WORKING_DIR%目录不存在解决办法
- requirejs初体验
- [SCOI2007]组队
- [转]JVM性能调优监控工具