对文件的 *** 作,无非就是增加、删除、查询、修改;
(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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)