Linux 文本三剑客 - sed

774 阅读2分钟

sedstream editor 的缩写,它一种流编辑器,它一次处理一行内容 。

基本用法如下:

# sed --help
sed [OPTION]... {script-only-if-no-other-script} [input-file]...

# sed [参数] '范围 操作'  文件

例:

sed -n '1,4 p' demo.txt  # 打印demo.txt文件1~4行的内容

常用选项参数

  • -n 使用安静(silent)模式。加上-n参数后,则只有经过 sed 特殊处理的那一行(或者command)才会被列出来。
  • -i 直接编辑原文件
  • -i.bak 直接编辑原文件,同时会生成一个.bak的备份文件。推荐使用这种方式。防止误操作
  • -f -f filename 可以执行filename内的 sed 命令
  • -e 多点编辑

范围选择

sed 可以很灵活的查找对应范围的内容,常见的范围选择如下:

  • 2 选择第二行
  • $ 选择最后一行
  • 2,5 选择 2~5行
  • 1~2 奇数行
  • 2~2 偶数行
  • 1,$ 第一行到文件最后一行

另外 sed 还支持正则匹配。比如:

  • /name/ 出现name 字符的行

  • /name/,+3 出现 name 字符的行内容以后边的3行

  • /^xxx/ 选择已 xxx 开头的行

  • /xxx/,/yyy/ 出现 xxx 的行以及出现 yyy 行之间的数据

  • 常见正则匹配表达式如下:

    • ^ 匹配行开始。 如: /^sed/ 以sed开头的行

    • $ 匹配行结束。如: /sed$/ 以sed结尾的行

    • . 单个字符

    • * 0个或者多个匹配

    • + 1个或者多个匹配

    • ? 0个或者1个匹配

    • x\{m,n\} 重复连续字符x,m-n次数

    • `x{m} # 重复字符x,m次,如:/0{5}/匹配包含5个0(连续的)的行。

常见操作

  • p 打印匹配到的内容

  • d 将匹配到的内容进行删除。 如果需要对原文件进行编辑, 需要结合 -i-i.bak 参数

  • w 匹配到的内容写入到其他文件。 例:

    sed -n '/xxx/ w output.txt' demo.txt  # 将demo.txt 文件中包含 xxx 的行内容写入 output.txt
    

常用技巧

显示第一行的内容

sed -n '1'p filename

显示第三行到最后一行的内容

sed -n '3,$'p filename

显示匹配 name 关键的行

sed -n '/name/'p

打印出现 <command> 的行以及出现 </command> 行之间的数据

sed -n '/<command>/,/<\/command>/ p'  demo.txt

打印长度不小于5个字符的行

 sed -n  '/^.\{5\}/ p' demo.txt

删除所有的空行

sed -e '/^$/ d' demo.txt

删除行首的空格

sed -e 's/^[ \t]*//g' demo.txt

删除行尾的空格

sed -e 's/[ \t]*$//g' demo.txt

给文件的每一行使用双引号包围起来

sed  -e 's/.*/"&"/g' demo.txt

将文件的内容多行换成单行,同时每一行过滤掉收尾的空格并且使用双引号包围起来

例如:

abc

123

转成如下格式:

"abc","123"

sed -e 's/[ \t]*$//g' -e  's/^[ \t]*//g' -e '/^$/ d' -e 's/.*/"&"/g' demo.txt |tr "\n" "," |sed -e 's/,$//g'

# 这里还有一个相对简单的命令也可以起到相同的目的,不过行内字符串中间有空格或者换行符时得到的结果可能会不同
echo '"'`awk '{print $1}' demo.txt |xargs |sed 's/ /","/g'`'"'

原文链接:Linux 文本三剑客 - sed