Linux sed 命令


目录
  • sed命令整体可以干嘛
    • 命令简介
    • 样例文本说明
  • 查找
    • 查找指定行数的内容并打印
    • 查找指定关键字所在的行,并打印
  • 插入
    • 插入空行
    • 在指定位置插入内容
  • 删除
    • 删除指定行
    • 删除指定范围的行
    • 删除最后一行
    • 搜索指定的位置的行
    • 删除所有空行
  • 替换
    • 给文本编号
  • 多命令模式
  • 一些option参数
    • 就地修改-i
    • 只输出匹配到的文本-n
  • 总结
  • 参考资料

sed命令整体可以干嘛

总体而言,sed命令可以对文本进行查找、删除、插入、替换等操作。它跟vim或者vi命令最大的去区别是,后者只能通过人工交互的方式,对文本进行处理。而很多时候,我们希望脚本自动化的进行文本处理,那么sed无疑是我们的好帮手

命令简介

sed OPTIONS [SCRIPT] [INPUTFILE...] 
  • OPTIONS 用于指定对处理后的文本的一些输出行为,比如-i,-n,后续会详解
  • SCRIPT 定义实际的处理行为,比如想要查询什么、删除什么、插入什么
  • INPUTFILE 这是具体要被处理的文本。文本还可以来自于管道符,于是命令格式形如下
    echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
    

样例文本说明

为了方便对命令处理效果的说明,首先我们准备一个文本sed_learn.txt,其内容如下

unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.

查找

在script中,以p做为查找输出命令,意即print

查找指定行数的内容并打印

打印1到2行的文本

sed -n '1,2 p' sed_learn.txt  

输出结果

unix is great os. unix is opensource. unix is free os.
learn operating system.

上述搜索打印使用到了参数-n,详细讲解

查找指定关键字所在的行,并打印

打印包含unix关键字的行sed -n '/unix/p' sed_learn.txt,输出结果如下

unix is great os. unix is opensource. unix is free os.
unix linux which one you choose.

其中两斜杠/unix/ 中间,除了可以指定关键字,还可以指定正则表达式

插入

插入空行

使用G表示插入空行

  • 在每行后面插入空行

    sed 'G' sed_learn.txt
    

    结果如下

    unix is great os. unix is opensource. unix is free os.
    
    learn operating system.
    
    unix linux which one you choose.
    
    
  • 在每行后插入两个空行 sed 'G;G' sed_learn.txt
    结果如下为

    unix is great os. unix is opensource. unix is free os.
    
    
    learn operating system.
    
    
    unix linux which one you choose.
    
    
    

在指定位置插入内容

  • 在包含指定关键字的行后面插入新行 :sed '/love/G' sed_learn.txt表示在包含love的行后面插入新行
  • 在指定位置插入空格:sed 's/^/ /' a.txt 表示在所有行前,插入5个空格,^表示行首

删除

在script中指定d命令,表示对文本进行相关的删除动作

删除指定行

比如sed '1d' sed_learn.txt表示删除第一行

删除指定范围的行

sed '1,2d' sed_learn.txt //表示删除1到2行
sed '1,$d' sed_learn.txt //表示删除1到最后一行

删除最后一行

sed '$d' sed_learn.txt

搜索指定的位置的行

sed '/unix/d' sed_learn.txt  //表示删除所有包含unix的行

删除所有空行

sed '/^$/d' sed_learn.txt

替换

替换命令的脚本格式一般为sed line_number1,line_number2 's/search_keyword_or_regular_express/string_for_replace/search_range_for_one_line'

  • search_keyword_or_regular_express 指定在一行中匹配的关键字或正则表达式

  • string_for_replace:指定匹配到后,替换的字符。

  • search_range_for_one_line:指定在一行中,搜索匹配的范围。默认只对一行中第一次匹配到的内容进行替换

  • line_number1,line_number2 前面都是对具体某一行的匹配替换行为进行指定,这里指定具体要对哪些行进行匹配替换

  • 例如:sed '1,3 s/unix/linux/' sed_learn.txt 表示,将1到3行中的第一次匹配到unix的地方,替换成linux

  • 例如:sed '1,3 s/unix/linux/g' sed_learn.txt 表示,将1到3行中的所有匹配到unix的地方,替换成linux

给文本编号

  1. 给所有行编号: sed = sed_learn.txt | sed 'N;s/\n/\t/' , 其中等号=是给文本每行前面插入一个带数字的行,由于换行了,所以管道符后面将换行符\n变成了制表符\t。 当然我们可以直接换成空格sed = sed_learn.txt | sed 'N;s/\n/ /

  2. 给非空行编号:sed '/./=' a.txt | sed '/./N; s/\n/ /',通过/./匹配到所有非空的行,然后使用=编号。最后,再将换行符\n替换成空格

多命令模式

在script中,可以指定多组命令,用分号隔开就行

比如sed 'G' sed_learn.txt,表示插入一个空行
sed 'G;G' sed_learn.txt 表示插入两个空行

一些option参数

就地修改-i

前面讲的所有查询、删除、替换,都是直接将处理结果输出到终端,为了保留这些处理结果,我们可以使用重定向到某个文件进行保存,比如sed '/unix/d' sed_learn.txt > result.txt。但我们也可以通过指定-i 参数,直接将修改后的结果,更新到原文件,这里的-i代表in place 即为就地的意思

例如sed -i '1,$ s/unix/linux/g' sed_learn.txt 会将sed_learn.txt的内容,直接更新为如下

linux is great os. linux is opensource. linux is free os.
learn operating system.
linux linux which one you choose.

https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/

https://www.geeksforgeeks.org/sed-command-linux-set-2/