文本处理三剑客之sed(下)

文本处理三剑客之sed(下),第1张

文本处理三剑客之sed(下) 5、sed中的编辑命令详解

        对文件的 *** 作,无非就是增加、删除、查询、修改;

    (1) command(编辑命令)对照表:

类别	|    编辑命令  |	含义
--------------------------------------------------
查询		  p		        打印(print)
--------------------------------------------------
增加		  a		   行后追加(append),匹配到的行后追加内容
增加		  i		   行前追加,匹配到的行前追加内容
增加		  r		   外部文件(read)读入,行后追加,将后面指定文件的内容追加到匹配的行后面
增加		  w		   匹配行写入外部文件(write),将匹配到的行内容另存到其它文件中
---------------------------------------------------
删除       d		        删除(delete)
---------------------------------------------------
修改    	s/old/new/	    将行内第一个old替换为new
修改	    s/old/new/g	    将行内全部的old替换为new
修改    	s/old/new/2	    将行内第2个old替换为new
修改	    s/old/new/2g	将行内第2个开始old全部替换为new
修改    	s/old/new/ig	将行内old全部替换为new,忽略大小写
---------------------------------------------------

    (2) 编辑命令查找、增加和删除总结:

# [1] sed使用编辑命令d删除第1行,只输出修改后的文件内容,并不会对原文件做修改
~ % sed '1d' sed.txt
I like PYTHON
Hadoop is bigdata frame
# 使用head 命令查看文件,可以看到内容并没有改变
~ % head sed.txt    
I like python
I like PYTHON
Hadoop is bigdata frame
# sed使用编辑命令d,加上-i直接修改文件内容
~ % sed -i -e '1d' sed.txt
~ % head sed.txt    
I like PYTHON
Hadoop is bigdata frame
# [2] sed使用编辑命令d删除第1行至第三行内容,并修改原文件
~ % sed -i -e '1,3d' sed.txt
# [3] 将passwd文件中不能登录的用户全部删除掉,包含‘/bin/nologin’都删除
~ % sed -i -e '//bin/nologin/d' passwd
# 删除第一不能登录的用户,到第13行的所有内容,需要注意这里文件从上到下会多次把符合删除
~ % sed -i -e '//bin/nologin/,13d' passwd
# 删除以yarn开头的行到最后一行的所有内容
~ % sed -i -e '/^yarn/,$d' passwd
# [4] sed使用a编辑命令,将匹配符合的所有行,行后追加a后面内容,固定格式如下:
~ % sed -i '//bin/nologin/a This is user which can login to system' passwd
# [5] sed使用i编辑命令,将匹配模式区间中的所有行,行前追加i后面内容,固定格式如下:
~ % sed -i '/^hdfs/,/^yarn/i HHHHHHHH' passwd
# [6] sed使用r编辑命令后面跟file,将匹配到的root所在行,
# 追加file文件内容到行后面,固定格式如下:
~ % sed -i '/root/r list.txt' passwd
# [7] sed使用w编辑命令后面跟要保存文件的路径,将匹配到的所在行,
# 保存到love.txt文件中,固定格式如下:
~  % sed -n '/love/w /tmp/love.txt' sed.txt
# 删除文件中纯数字行,+为正则中扩展字符,sed需要加-r
~ % sed -i -e -r '/[0-9]+/d' str.txt 
------------------------------------------------------
# Mac下使用sed编辑命令a,a后回车换行,然后追加文本
 % sed -i -e '/love/a                        
quote> This is a love' sed.txt

  (3) 编辑命令修改用法总结:

        1. s/pattern/string/ --- 查找并替换,查找符合pattern模式的字符串,将其替换为string,只替换1次。

        2. s/pattern/string/g --- g表示全部行内全部匹配,g为global整体简写,s为sed命令的简写。

        3. s/pattern/string/2 --- 2表示,同一行内,只替换第2个匹配的,剩下的不替换

        4. s/pattern/string/2g --- 2g表示,同一行内,只替换从第2个开始到剩下所有的复合条件字符串

        5. s/pattern/string/ig --- 加i参数表示匹配时忽略大小写,g表示匹配到的全部替换

# [1] 只替换匹配到的每行中第一个,行中其它都不会被替换,固定格式:‘s///’
~ % sed -i -e 's/love/like/' sed.txt
# [2] 将文件中所有love字符串替换成like,固定格式:‘s///g’
~ % sed -i -e 's/love/like/g' sed.txt
# [3] 只替换匹配到的每行中第2个,行中其它都不会被替换,固定格式:‘s///n’,n为正整数
~ % sed -i -e 's/like/love/2' sed.txt
# [4] 替换每行中从第2个开始剩下所有符合字符串,固定格式:‘s///2g’
~ % sed -i -e 's/like/love/2g' sed.txt
# [5] 将文件中所有love字符串替换成like,对love不区分大小写,固定格式:‘s///ig’
~ % sed -i -e 's/like/love/ig' sed.txt

  (5) 其它编辑命令:

        1. = --- 显示行号,不显示该行内容

~ % cat sed.txt
This is a love  This is a love  This is a love n I love shell
This is a love  This is a love  This is a love n I love java
This is a love  This is a love  This is a love n I love python
# 显示python字符串所在行号,而不显内容
~ % sed -n '/python/=' sed.txt
3

  (6) 什么是反向引用?

#[1]、将文件中所有的hadoop后面加s
sed -i 's/hadoop/hadoops/g' str.txt

#[2]、现在有如下文件,将had[XX]p形式的字符后面加s
~ % cat str.txt 
hadAAp is a bigdata frame
Spark hadBBp Kafka
Skill on hadCCp
Paper of hadDDp
Google hadEEp
# ‘..’表示任意两个字符,一个点表示任意单个字符,&表示前面‘/had..p/’匹配到的值
# 反向引用指的就是前面指定的匹配模式,通过使用&将匹配到的值原封不同保留下来。
~ %  sed -i -e 's/had..p/&s/g' str.txt
~ %  cat str.txt
hadAAps is a bigdata frame
Spark hadBBps Kafka
Skill on hadCCps
Paper of hadDDps
Google hadEEps
#[3]、将had[XX]ps形式的字符串后面加大写O
# '1'和&是等价都是反向引用符号,如果使用'1'需要将看面的匹配模式括号括起来
~ % sed -i -e 's/(had..ps)/1O/g' str.txt
zhaopengkang@xiaokang /tmp % cat str.txt                            
hadAApsO is a bigdata frame
Spark hadBBpsO Kafka
Skill on hadCCpsO
Paper of hadDDpsO
Google hadEEpsO
# '1'比&使用更灵活,&只能进行整个替换,不能将匹配到的值拆分进行部分替换
#[4]、匹配到had[XX]psO的值中只替换一部分,将[XX]psO替换成doop,
# 用括号括住不需要改变的部分,‘(had)’
~ % sed -i -e 's/(had)...../1doop/g' str.txt
zhaopengkang@xiaokang /tmp % cat str.txt                                
haddoop is a bigdata frame
Spark haddoop Kafka
Skill on haddoop
Paper of haddoop
Google haddoop
# 总结: '1'和&它们都作为反向引用,在引用整体时候没有任何区别,
# 只是'1'比&灵活的地方就是可以进行部分替换

  (7) sed中引用变量时注意事项:

        匹配模式中存在变量,建议使用双引号

        sed中需要引用自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号

        1)32.sed_quote_var.sh代码,如下:

#!/bin/bash

# sed匹配模糊中引用变量
old_str=hadoop
new_str=HADOOP

# 在这里这样写是错的,会把'$变量名'当成字符串处理
# sed -i -e 's/$old_str/$new_str/g' str.txt

# 方式一:匹配模式中引用变量时,使用双引号,变量可以直接使用$引用
# sed -i -e "s/$old_str/$new_str/g" str.txt

# 方式二:匹配模式中引用变量时,将变量使用单引号引起来
# sed -i -e 's/'$old_str'/'$new_str'/g' str.txt

        2)运行脚本结果代码如下:

~ % cat str.txt
hadoop is a bigdata frame
Spark hadoop Kafka
Skill on hadoop
Paper of hadoop
Google hadoop
# [1]、运行脚本,使用方式一
~ % sh 32.sed_quote_var.sh
~ % cat str.txt
HADOOP is a bigdata frame
Spark HADOOP Kafka
Skill on HADOOP
Paper of HADOOP
Google HADOOP
~ % vim str.txt
# vim编辑文件在命令模式下输入以下内容:意思:从当前的行到最后一行将HADOOP全部替换成hadoop
:.,$s/HADOOP/hadoop/g
# [2]、运行脚本,使用方式二
~ % sh 32.sed_quote_var.sh
~ % cat str.txt
HADOOP is a bigdata frame
Spark HADOOP Kafka
Skill on HADOOP
Paper of HADOOP
Google HADOOP

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5677992.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存