个人工作之中经常使用sed,但是比较简单的命令,并没有仔细的研究过sed详细用法,所以参考man手册进行了详细的整理。
sed是一个流式文本编辑器,可用来过滤和转换文本。基本用法如下:
[source,shell]
----
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
----
其中的“[OPTION]”是可选的命令行参数,“{script-only-if-no-other-script}”是要执行的sed命令(如果没有用-e或-f指定别的命令的话,否则会视为输入文件路径),“[input-file]”是输入文件的路径。
sed的命令格式为:[地址]命令。地址是可选的,根据具体的命令而定。如‘/^hostname/aip=8.8.8.8’,‘p’等,地址格式和具体的命令可参下文。
== 选项及其含义
-n::
--quiet::
--silent::
禁用自动打印模式空间,也就是禁止打印匹配的内容
-e script, --expression=script::
添加要执行的sed命令
-f script-file, --file=script-file::
将文件中的内容添加到要执行的命令中
--follow-symlinks::
在in-place(如下)模式下,追踪符号链接
-i[SUFFIX], --in-place[=SUFFIX]::
对文件进行直接更改,如果提供了SUFFIX,会使用SUFFIX作为扩展名进行备份
-l N, --line-length=N::
指定行的长度
--posix::
禁用所有的GNU扩展
-E, -r, --regexp-extended::
在命令中使用posix扩展正则表达式(考虑到兼容性,应使用-E)
-s, --separate::
将各个文件单独对待,而不是一个长的连续的文本流。
--sandbox::
在沙箱模式下运行
-u, --unbuffered::
每次加载较小数量的数据,并加快刷新输入缓存的频率。
-z, --null-data::
采用NUL字符(ascii 0)分割行
--help::
显示帮助信息
--version::
打印版本信息
如果没有指定-e,--expression,-f或--file选项,那么第一个非选项参数(及位置参数)将被作为命令来对待,剩下的所有参数都将作为文件名处理,如果没有指定文件名,则在标准输出中读取数据。
== 命令列表
=== 无地址命令
: label::
*b*和*t*的标号
#comment::
注释持续到换行符(或-e参数的结尾)
}::
{}区块的闭合括号
=== 0或1个地址的命令
=::
打印当前行号
a \ text::
在该行之后插入文本
i \ text::
在该航之前插入文本
q [exit-code]::
立即退出,并且不打印任何输出,若未禁用自动打印,则会打印当前的模式空间。退出状态码是GNU扩展
Q [exit-code]::
立即退出,并且不打印任何输出,这是GNU扩展
r filename::
添加filename文件中的内容
R filename::
添加filename文件中的一行内容,每次执行命令读取一行。这是GNU扩展。
=== 接收地址范围的命令
{::
开始一个命令区块(以}结束)
b label::
分支到label;如果label省略,则到命令的结束
c \ text::
用text替代匹配的行。
d::
删除匹配的模式空间,开始下次循环
D::
如果模式空间不包含换行符,开始新的循环,如d命令。否则,删除模式空间中的文本,直到第一个换行符,并重新开始循环,无需读取新的一行。
h H::
复制/添加模式空间到保持空间
g G::
复制/添加保持空间到模式空间
l::
List out the current line in a ``visually unambiguous'' form.
l width::
List out the current line in a ``visually unambiguous'' form, breaking it at width characters. This is a GNU extension.
n N::
Read/append the next line of input into the pattern space.
p::
打印当前模式空间
P::
打印当前模式空间直到第一个换行符
s/regexp/replacement/::
尝试在模式空间中匹配regexp。如果成功,将匹配的部分用replacement替换。replacement中可包括特殊字符&,用来引用模式空间中匹配的部分,特殊的转移\1到\9引用相应的子匹配。
t::
子最后一行读取并且最后的的t或T命令,如果s///成功完成了替换,则分支到label;如果label省略,则分支到命令最后。
T::
子最后一行读取并且最后的的t或T命令,如果s///未成功完成了替换,则分支到label;如果label省略,则分支到命令最后。这是GNU扩展。
w filename::
将当前的模式空间写入到文件
W filename::
将当前模式空间中的第一个行写入到文件。这是GNU扩展。
x::
交换模式空间和保持空间
y/source/dest/::
把模式空间中出现在source中的字符用dest中的相应字符替换
== 地址
sed命令可以无地址,这样,对于所有的输入行,命令都会执行;如果提供了一个地址,只有匹配该地址的行执行命令;如果提供了两个地址,所有在第一个地址和第二个地址之间的行都会执行命令。关于地址区间有三点要注意:语法是addr1,addr2(地址用逗号分割);addr1匹配的地址总是被接受的,及时addr2是一个在addr1之前的地址;如果addr2是regexp,则不会去验证addr1匹配的行。
在地址之后和命令之前可插入!,表示地址不匹配时,命令才执行。
number::
只匹配这个特定的行号
first~step::
从first开始,按照step步进。如‘sed -n 1~2p’打印所有奇数行。
$::
匹配最后一行
/regexp/::
进行正则表达式匹配
\cregexpc::
进行正则表达式匹配。c可以是任意字符
GNU sed也支持一些特殊的2地址形式:
0,addr2::
Start out in "matched first address" state, until addr2 is found. This is similar to 1,addr2, except that if addr2 matches the very first line of input the 0,addr2 form will be at the end of its range, whereas the 1,addr2 form will still be at the beginning of its range. This works only when addr2 is a regular expression.
addr1,+N::
匹配addr1和后面的N行。
addr1,~N::
Will match addr1 and the lines following addr1 until the next line whose input line number is a multiple of N.
sed命令详解
发布于