文本三剑客之sed

一、简介

sed是一种流编辑器,能够完美的配合正则表达式使用。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作。

在这里插入图片描述

1.1 sed的命令使用

sed的使用方式有两种:

#sed的命令格式
sed [options] 'command' file(s);
#sed的脚本格式,即将command写入scriptfile中
sed [options] -f scriptfile file(s);

常用的options

  • -r: 支持扩展正则表达式;
  • -n: 静默模式;在“模式空间”中没能被处理的就不再输出至标准输出设备
  • -e command1 -e command2:指定多命令编辑运行;
  • -f /path/to/script_file:从指定的文件中读取脚本并运行;
  • -i: 直接修改源文件(即处理结果输出给源文件);

command之定位范围
Sed在没有给定的范围时,默认会处理所有行,一旦给点范围则只会将范围内的行放入模块空间中,等待处理。

sed支持以下几种范围定位

  1. #: 指定行,其中$特指最后一行;
  2. /regexp/:任何能够被regexp所匹配到的行;
  3. %regexp%:同上,只不过换作%为regexp边界符;
  4. |%regexp%|:匹配时忽略字符大小写;
  5. startline,endline:行范围指定
    num1,num2:从num1行到num2行
    #,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行;
    /regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行;
  6. #,+n:从#行开始,一直到向下的n行;
  7. first~step:指定起始行,以及步长; 1~2表示 1,3,5,7,9……行

conmmand之处理操作

  • a\text 在当前行下面插入文本text;
  • i\text 在当前行上面插入文本text;
  • c\text 把选定的行改为新的文本text;
  • d 删除,删除选择的行;
  • s 替换指定字符。格式:s/regexp/replacement/;把regexp所匹配到的内容替换为replacement,也可以使用@替代/;有两个修饰符:g: 全局替换,即整行匹配的都完成替换;i: 不区分大小写
  • n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
    sed -n 'p;n' test.txt  #奇数行
    
  • p 打印缓存模式中的行。
  • r file 从file中读行;
  • w file 写并追加缓存模式中的行到file末尾;
  • W file 写并追加缓存模式中的第一行到file末尾;
  • ! 表示后面的命令对所有没有被选定的行发生作用;
  • = 打印当前行号;

1.2 sed命令用例

#替换文本中的字符串:
sed 's/book/books/' file
#-n选项和p命令一起使用表示只打印那些发生替换的行:
sed -n 's/test/TEST/p' file
#直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books
sed -i 's/book/books/g' file

#删除空白行:
sed '/^$/d' file
#删除文件的第2行:
sed '2d' file
#删除文件的第2行到末尾所有行:
sed '2,$d' file
#删除文件最后一行:
sed '$d' file
#删除文件中所有开头是test的行:
sed '/^test/'d file

#已匹配字符串标记&
echo this is a test line | sed 's/\w\+/[&]/g'
 [this] [is] [a] [test] [line] 
#匹配字符串分组
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' 
 BBB aaa

#在example中所有包含test的行都被写入file里:
sed -n '/test/w file' example

#将 this is a test line 追加到 以test 开头的行后面:
sed '/^test/a\this is a test line' file
#i\命令 将 this is a test line 追加到以test开头的行前面:
sed '/^test/i\this is a test line' file
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值