最近我见过很多这样的命令sed
,我发现这是一个相当令人困惑的命令。手册页并不是特别有用,但我知道它可以用于解析其他命令的输出。
它到底是什么?sed
它有什么用途?我正在寻找一个全面的答案,涵盖它是什么sed
、它的常用用途以及一些基本示例/语法。
答案1
在基本用法中,它用于字符串的“搜索和替换”。
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
,相当全面。
答案2
定义
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
相比之下,flavors 仅在版本中具有这样的功能GNU awk
。
sed
可以在命令行上输入,使用分号 ( ) 分隔的多个模式;
,或者从标志后指定的脚本文件中输入-f
,例如cat someTextfile.txt | sed -f myScript.sed
Sed 应用程序和示例
答案3
这个答案还在进行中 - 它缺少有关 subsbstitute 命令的更多示例
什么是sed
?
sed
= 流编辑器
GNU 4.2.2 手册页中的描述sed
报告:
Sed 是一个流编辑器。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。虽然在某些方面类似于允许脚本编辑的编辑器(例如 ed),但 sed 的工作方式是只对输入进行一次传递,因此效率更高。但 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>
是基本或扩展正则表达式):以下命令将在从第一行包含出现的行<pattern1>
到下一行包含出现的行上执行<pattern2>
,如果多次有序出现<pattern1>
-<pattern2>
则执行多次;<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
中的开关时很有用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>
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>
为:<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
答案4
sed
是一个强大的命令,使您能够执行一些操作(删除行、字符串替换、字符串过滤等)。
我可以给你一个带有 args 的用途列表,但互联网上充斥着这样的列表。搜索sed usage by examples
给我带来了很多结果,可爱的一个:http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/