sed是什么,它的作用是什么?


20

我最近已经看到很多东西了sed,我发现它是一个相当混乱的命令。手册页并不是特别有用,但是我确实知道它可以用于解析其他命令的输出。

究竟是sed什么?有什么用?我正在寻找一个全面的答案,涵盖什么sed是什么,通常用于什么以及一些基本示例/语法。


3
来自Sed手册页:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89

这应该是一个开始全面答案的好地方:en.wikipedia.org/wiki/Sed
saji89 2013年

1
info sed还有很多man sed。然后,在/usr/share/doc/sed,有sedfaq.txt.gz

Answers:


20

在基本用法中,它用于字符串的“搜索和替换”。

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

退货

"The quick brown fox jumps over the lazy cat"

当使用正则表达式时,Sed确实会发光。

您可能想看一下有关的文章sed,它相当全面。


5

定义

Unix System V:实用指南,Mark Sobell所著:

sed实用程序是批处理(非交互式)编辑器。sed命令通常存储在脚本文件中。。。尽管您可以从命令行给出简单的sed命令。。。

sed(GNU sed)4.2.2的手册页:

Sed是流编辑器。流编辑器用于对输入流(文件或管道输入)执行基本的文本转换。

我的非正式定义:

Sed流编辑器的缩写)是一种文本处理实用程序,它是在一次处理一行文本时开发的,但是仍然是功能最强大的Unix / Linux实用程序之一;同时,它是一种脚本语言,专门用于处理文本。

用途

如定义所暗示的,sed用于批处理文本行,文本文件和管道文本流。最常见的是,它用于替换和删除文本:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

但是,它也可以用来模仿其他命令的行为。例如,

  • 模仿dmesg | head -n 3(打印前三 行),我们可以做到dmesg | sed -n 1,3p
  • 模仿dmesg | grep 'wlan0'(搜索字符串),我们可以dmesg | sed -n '/wlan0/p'
  • 项目清单

sed与其他文本处理实用程序相比,最大的优势是-i标志,这意味着我们不仅可以将编辑后的文本输出到屏幕上,还可以将编辑内容实际保存到原始文件中。awk相比之下,口味仅在GNU awk版本中具有这种功能。

sed可以在命令行上输入,以分号(;)或从-f标志后指定的脚本文件分隔的多个模式进行输入,例如cat someTextfile.txt | sed -f myScript.sed

sed应用程序和示例



1

这个答案是一个正在进行的工作-它错过了有关susbstitute命令的更多示例


什么sed

sed =流编辑器

GNU sed4.2.2报告的手册页中的描述:

Sed是流编辑器。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。尽管在某种程度上类似于允许脚本编辑(例如ed)的编辑器,但sed只能通过对输入进行一次传递来工作,因此效率更高。但是sed能够过滤管道中的文本,这使其与其他类型的编辑器特别有区别。

gnu.orgGNU sed页面中的解密代码报告:

sed(流编辑器)不是交互式文本编辑器。相反,它用于过滤文本,即,它接受文本输入,对其进行一些操作(或一组操作),然后输出修改后的文本。sed通常用于使用模式匹配或替换文件中多次出现的字符串来提取文件的一部分。

有什么sed用?

它可用于对数据流(通常是文本,但也可用于修改二进制数据)执行复杂的修改。

在最常见的使用情况中有:

  • 使用基本/扩展正则表达式从文本文件中选择性地打印/删除行
  • 使用基本/扩展正则表达式全局替换文本文件中的字符串
  • 使用基本/扩展正则表达式选择性替换文本文件中的字符串

这些是此答案中涉及的使用情况。

用法

sed如果在调用过程中在命令行参数中指定了文件名,则从存储在文件系统中的文件中读取输入,或者stdin如果未指定文件名,则从文件中读取输入。

使用存储在文件系统中的文件进行最小调用:

sed '' file

最小调用使用stdin

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

你好,世界!

sed默认情况下,逐行读取输入文件;它读取一行,删除行尾的换行符,并将处理后的行放入“模式空间”中;最后,它在模式空间的当前内容上执行列出的命令,并从输入文件中读取新行。

如果未指定命令或指定了* pd命令*,sed则每次迭代时都将始终打印模式空间的当前内容,并在换行符后打印:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

为了防止这种情况,可以sed-n开关一起调用:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

*说起只为pds命令,这些命令包括在本答案的命令。

选择线

sed可以处理整个输入文件或仅处理输入文件的选定行;通过指定“地址”来选择要处理的输入文件的行;地址(除其他外)可以是行号或模式;可以通过指定地址范围来选择行范围。

地址的可能组合为:

  • <N>(其中<N>有一个数字):以下命令仅在行号上执行<N>
  • <N>,<M>(其中<N><M>是两个数字,<N>> <M>):以下命令将在从行号<N>到行号(<M>包括端号)的行上执行;
  • /<pattern>/(其中<pattern>是基本或扩展的正则表达式):以下命令仅在包含<pattern>;的行上执行;
  • /<pattern1>/,/<pattern2>/(其中,<pattern1><pattern2>是基本或扩展正则表达式):下面的命令/命令将上线从含有的occurence第一行执行<pattern1>到含有的occurence下一行<pattern2>,多次在多个的情况下,有序<pattern1>- <pattern2>OCCURENCES;
  • <N>,/pattern/(其中<N>是数字,<pattern>是基本或扩展的正则表达式):以下命令将在从行号<N>到包含<pattern>;的第一行的行上执行。
  • /pattern/,<N>(这里<pattern>是一个基本或扩展的正则表达式,并且<N>是一个数字):以下命令将在从第一行包含<pattern>到行号的行上执行<N>

为了打印,删除或替换行范围而执行的选择将始终包括与指定地址匹配的行;此外,为了打印,删除或使用模式对行范围进行替换而执行的选择是惰性的全局的(即,每个受影响的范围将始终尽可能最小,并且多个范围将受到影响)。

当打印行范围或仅打印已执行替换的行时,有必要sed-n开关一起调用,以防止与标准匹配的行被打印两次(仅在打印行范围时发生)防止行不匹配要打印的标准。

在选择要处理的行之后,必须跟随一个命令或使用括号将多个以分号分隔的命令组合在一起。

命令:打印,删除

用于打印或删除选择的命令分别是:

  • p:打印与指定地址/地址范围匹配的行;
  • d:删除与指定地址/地址范围匹配的行;

当这些命令之一被通过地址/选择之前,该命令被执行全局的,即在输入文件的每行。

示例:打印,删除

打印/删除指定数字地址的行:

样本文件:

line1
line2
line3
line4
line5
  • 印刷线<N>
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • 删除行<N>
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • 印刷生产线<N>,以<M>包容性:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • 删除行<N><M>含):
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

打印/删除指定模式的行:

样本文件:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • 印刷线配套<pattern>
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • 删除匹配的行<pattern>
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • 从匹配<pattern1>的行到匹配的行打印行<pattern2>
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • 从匹配<pattern1>的行到匹配的行删除行<pattern2>
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

命令:替代

用于对选择执行替换的命令是:

  • s:替换与指定地址/地址范围匹配的行;

当该指令不是由地址/选择之前,该命令被执行全局的,即在输入文件的每行。

s命令的语法为:

s/<pattern>/<replacement_string>/<pattern_flags>

斜杠是“定界符”;它们被用来分隔<pattern><replacement_string><pattern_flags>段;

分隔符始终是紧跟该s命令的字符;可以将其设置为任何其他字符,例如|

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>是基本或扩展的正则表达式;<replacement_string>是一个固定的字符串,可能包含sed具有特殊含义的特定序列;<pattern_flags>是修改行为的标志列表<pattern>

最常见的sed特定序列,具有特殊含义:

  • &:用匹配的字符串替换反向引用<pattern>;
  • \<N>(其中<N>有一个数字):向后引用替换为;中<N>捕获的组<pattern>

最常见的标志:

  • g:强制<pattern>全局匹配,即每行多次。
  • i<pattern>不区分大小写地匹配;
  • p:再次打印已执行替换的行(在调用中使用-nswitch sed来仅打印已执行替换的行时很有用);

示例:替代

样本文件:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • <pattern><replacement_string>每行替换with 的第一次出现:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • 替换每行中所有<pattern>with的<replacement_string>出现:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • 仅选择以开头的行,<pattern1>并替换以的所有出现<pattern2>的行<replacement_string>
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • 仅选择以结尾的行,<pattern1>并替换以的所有出现<pattern2>的行<replacement_string>
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.