Linux 流编辑神器 sed

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

sed

在 UNIX 或 Linux 系统中,利用管道操作符 |,可以将多个命令由连成「管道线」。流过管道线的信息(数据)就叫做(stream);

(注:这篇文章是很多很多年前写的了,我不知道这里参考了什么资料写出的“管道线”这个词,我想应该是指 Pipeline,更好的翻译应该是“流水线”)

为了编辑或修改一条管道中的信息,就使用流编辑器(stream editor)—— 这是sed这个命令的名字的由来。

sed 编辑文件,将结果输出到 1 (stdout),不改变原文件。

sed [选项] '以引号括起来的命令表达式' [输入文件]
复制代码
  • -e <expression>:e 是 expression, 以选项中指定的 script 来处理输入的文本文件,后接表达式
  • -f <file>:以选项中指定的 script 文件来处理输入的文本文件
  • -i:直接在文件中替换,不在终端输出
    • -i 常和用来备份原本文件的 -l 配合使用

如果在 sed 命令中使用多个命令表达式,这命令表达式中间要使用分号(;)分隔开。

其中常用的“以引号括起来的命令表达式”有:文本替换、删除

文本替换

在一个文件中指定数据行的范围内抽取某一字符串并用新的模式替代它:

sed -e 's/旧模式/新模式/标志' file
复制代码
  • s 是 substitute 的意思
  • 标志 常用的是:
    • g (globally),表示要替代每一行中所出现的全部模式。(无g只换每行的头一个)
    • n 告诉 sed 只替代前 n 行中所出现的模式。

e.g.

grep CLERK emp.fmt | sed -e 's/ /;/g;s/CLERK/ASSISTANT MANAGER/g'
复制代码
  1. grep将所有带CLERK的行找出;
  2. sed 将所有的空格(分隔符)都转换成分号(;);
  3. sed 将所有的CLERK字符串都替换成ASSISTANT MANAGER;

删除某行

在显示结果中删除第 n 行:

$ sed 'nd' file
复制代码

在显示结果中删除第m到n行:

$ sed 'm,nd' file
复制代码

删除所有带 str 的行:

$ sed '/str/d' file
复制代码

删除所有空行:

$ sed '/^$/d' file    # re("^$") means a line without any word.(只有开始符^和结尾符$的行)
复制代码

删除从第1行开始直到包含有str的数据行(包括有str的那行):

$ sed '1,/str/d' file
复制代码

e.g.(1)电子邮件和一些应用程序显示的每一行信息都是以>开始的,使用下面的一条sed命令来做到这一点:

$ sed '/^$/d;s/^/> /g' source >result
复制代码
  • 第 1 个命令表达式 /^$/d 表示要删除所有的空行,
  • 第 2 个命令表达式 s/^/>/ 表示将开始符号替换成大于符号和空格符,
  • 最后的 >result 表示将 sed 命令的结果存入 result 文件。

e.g.(2)在删除所有空行的同时,删除所有包含了 cal 的行,并将所有的字符串tie变成fox,将结果保存:

$ sed '/^$/d;/cal/d;s/tie/fox/g' source >result
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享