Linux的Shell脚本——day5——sed非交互文本编辑

13 篇文章 0 订阅

cp  路径/文件名{,.bak}   ==   cp  路径/文件名   路径/文件名.bak
  修改配置前做好备份


sed
   前置命令 | sed  [选项]  '条件指令'        把前面的命令的输出结果进行编辑操作
    sed  [选项]  '条件指令'  文件.. ..        对下面的文件逐行处理

选项

-n屏蔽默认输出,默认sed会输出读取文档的全部内容
-r让sed支持扩展正则
-i使得sed直接修改源文件,默认sed只是通过内存临时修改文件,对源文件无影响

注意:
    一般命令会有 -n 让sed默认不读取,而没有 -i 让sed的语句暂时不生效
    一般是在命令进行过测试后,再加入 -i 使得命令生效

条件指令
    注意:下面的所有例子,都是

 sed 条件指令 文件 

  的条件指令,具体操作的时候要把sed和目标文件写上

    条件

格式作用例子解释
行号 命令对指定行号的行进行操作'3p'打印第三行
起始行号,终止行号 命令对范围中的几行进行操作'2,6d'删除第2行到第6行
行号1 命令 ; 行号2 命令; ……对多行进行操作,没有行号先后区分'1p;2d'打印第一行然后删除第二行
起始行号,+附加的行数 命令从起始行号开始,再加指定行数,这写范围内的所有行进行操作'1,+3p'打印1到4行的内容
起始行号~步长 命令从起始行号开始,每隔一个步长的每个行进行操作'1~2p'打印奇数行的内容
'2~2p'打印偶数行的内容
/正则表达式/命令对匹配正则表达式的当进行操作,注意格式要求'/^\(root\)\|^\(ftp\)/d'删除文件中包以root或者ftp开头的行
$命令对最后一行进行操作'$!d'最后一行保留,其他全部干掉

    指令

命令作用用法及例子解释
i插入文本条件 i 内容在指定的行之前插入文本
a追加文本条件 a 内容在指定的行之后追加文本
c替换行条件 c 内容把指定行的内容替换,整行都替换掉
p打印条件p打印符合条件的内容,注意如果没有-n,sed默认打印所有
!p打印其他条件!p不打印符合条件的内容,打印其他的所有
=打印行号'$='输出文件一共多少行,$代表最后一行,=代表输出行号
'/^root/='输出以root开头的行号
d删除条件d删除符合条件的内容
'$d'删除最后一行
'/^$/d'删除所有空行 ,这是正则与之结合的结果
!d保留其他条件!d符合条件的不删除,其余删除
'/^root/!d'以root开头的保留,其余全部删除
s替换条件 s/被替换内容/替换成什么/第几个把文件中的每个符合条件的行的第几个匹配替换要求的内容进行替换,如果没有这么多个被替换内容就不替换,不写默认第一个
条件 s/被替换内容/替换成什么/g把文件中的每个符合条件的行的所有匹配替换要求的内容进行替换
条件 s/被替换内容/替换成什么/第几个 p把文件中的每个符合条件的行的第几个匹配替换要求的内容进行替换,然后显示,如果前面有-n,那么就可以完成替换后只显示替换的部分信息
条件 s#被替换内容#替换成什么#s后面紧跟的符号就是控制替换符号,可以是任意字符,包括空格,字符,数字,但是不建议使用
'2s/student//2p'把文件中第二行中第二个student替换成空,然后现实替换的内容,可以用作删除
'1,5s/^a/#a'在1到5行每个以a开头的行的前面加上注释
'6,10s/^#//'把6到10行中的注释的注释标示去掉,让其成为配置
'99s9\98\97\99\95\98\99gp'这里面替换控制符号是9,他就算把99行所有的98979替换成95989然后输出
'1s#^\(.\)\{'$n'\}\(.\)\(.*\)\(.\)\(.\)\{'$m'\}$#\1\4\3\2\5#'把第n个和倒数第m个字符对调
 
r导入文件条件 r 文件2把文件2(条件指令中的文件)中的内容添加文件1(sed命令后操作的文件)中到满足条件的行下
sed -n "2 r a.txt" b.txt把a.txt的内容添加到b.txt的第二行下
w导出文件条件 w 文件2把文件1(sed命令后操作的文件)中到满足条件的行另存到文件2中
sed -n "w a.txt" b.txt把b.txt的所有内容保存到a.txt中
H追加复制条件 H把符合条件的行的内容写入复制版中
h覆盖复制条件 h把符合条件的行的内容覆盖写入复制版中
G追加粘贴条件 G把复制版中的内容追加到符合条件的行后面,注意也没有回车
g覆盖粘贴条件 g把复制版中的内容覆盖到符合条件的行后面,注意也没有回车
例子:'2H;3h;5H;8G;9g'  一行一行的执行
逻辑理解:
    对于HhGg可以理解为,一个复制版里面本来就有一个回车,然后H是把内容追加写入到复制版的下一行中,h是把内容覆盖写入到复制版中,G是对于当前行追加写入复制版的内容,g是对于当前行进行覆盖写入

注意:
  0. 在sed中的空格没有太过严格的要求,条件与命令间有没有空格都可以,不影响使用,
     但是在用命令s进行替换的时候,每个空格都算是一个字符, s/被替换内容/替换成什么/ 这以部分间不能随便加空格,可以将其理解为一个整体 ,至于 第几个、是否打印,他们间有空格无所谓。
  1. 如果想让输出有该行在源文件的位置,可以用 cat -n 文件 | sed [选项] 条件 命令 
     但是这时候如果用正则匹配,开头匹配就不能用了,因为内容有了改变,原本再文件中开头的数据前面都有了行号,他们就不是在行首了
  2. 删除某一行或多行用命令 '条件d' ,如果删除某一行或多行中的某一些字段用 '条件s/目标字段//'
     替换后一行的内容用'条件 c 内容' , 如果替换后一行中的某个字段用'条件s/被替换的部分/替换成什么/'
  3. s后面紧跟的符号就是控制替换符号,可以是任意字符,包括空格,字符,数字,但是不建议使用
  4. 在sed的s替换中替换成什么,这个部分,符号基本都没有特殊含义,除了 \ 和被选定作为控制替换符号 , 如果要向替换成 \ 就要打 \\  如果向换成 \\ 就打 \\\ 依次类推 , 如果要替换成控制替换符号如 / 就要打 \/
    例如: sed -n 's/\([A-Z]\)/\/\\\1:"'/gp' 文件   其作用就是把全文所有的大写字母 变成 /\大写字母:"  然后打印出来

  5. 一般sed中用 ' ' 限定起来如果要用变量可以把中间的条件命令分开来 '……'$变量'……' 这样就可以了


都是按照要求查找一个文件,然后根据分割符号进行去尾

for i in $( sed -n '/正则匹配/s/分割符号*//p' 文件名 )
do
  echo $i
done

等同于

for i in $(grep '正则匹配' 文件名)
do
  c=${i%%分割符号*}
  echo $c
done

 

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lu-Yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值