我最近已经看到很多东西了sed
,我发现它是一个相当混乱的命令。手册页并不是特别有用,但是我确实知道它可以用于解析其他命令的输出。
究竟是sed
什么?有什么用?我正在寻找一个全面的答案,涵盖什么sed
是什么,通常用于什么以及一些基本示例/语法。
我最近已经看到很多东西了sed
,我发现它是一个相当混乱的命令。手册页并不是特别有用,但是我确实知道它可以用于解析其他命令的输出。
究竟是sed
什么?有什么用?我正在寻找一个全面的答案,涵盖什么sed
是什么,通常用于什么以及一些基本示例/语法。
Answers:
定义
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应用程序和示例
sed
是一个功能强大的命令,使您可以执行操作(删除行,替换字符串,过滤字符串等)。
我可以给您一个与args一起使用的列表,但互联网已填补了这一点。搜索sed usage by examples
给我带来了很多结果,很可爱:http : //www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/
这个答案是一个正在进行的工作-它错过了有关susbstitute命令的更多示例
sed
啊sed
=流编辑器
GNU sed
4.2.2报告的手册页中的描述:
Sed是流编辑器。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。尽管在某种程度上类似于允许脚本编辑(例如ed)的编辑器,但sed只能通过对输入进行一次传递来工作,因此效率更高。但是sed能够过滤管道中的文本,这使其与其他类型的编辑器特别有区别。
gnu.org的GNU 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
默认情况下,逐行读取输入文件;它读取一行,删除行尾的换行符,并将处理后的行放入“模式空间”中;最后,它在模式空间的当前内容上执行列出的命令,并从输入文件中读取新行。
如果未指定命令或指定了* p
或d
命令*,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 ~ %
*说起只为p
,d
和s
命令,这些命令包括在本答案的命令。
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
:再次打印已执行替换的行(在调用中使用-n
switch 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
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.