sed:输入流编辑器

Posted 小小超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed:输入流编辑器相关的知识,希望对你有一定的参考价值。

1、命令格式

sed [OPTION]... script-only-if-no-other-script [input-file]...

选项 内容
-n 只打印模式匹配的行
-e script 将脚本添加到要执行的命令中。直接在命令行模式上进行sed的动作编辑。
-f script-file 将脚本文件的内容添加到要执行的命令中。直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。
--follow-symlinks 当处理到位时,遵循符号链接;硬链接仍然会中断。
-i[SUFFIX] 直接修改文件内容
-c 在-i模式下移动文件时使用copy而不是rename。
-l N 为“l”命令指定所需的行换行长度
--posix 禁用所有GNU扩展。
-r 在脚本中使用扩展正则表达式。(默认是基础正则表达式)
-s 将文件视为单独的而不是单个连续的长流。
-u 从输入文件中加载最小数量的数据,并更频繁地刷新输出缓冲区
--help 显示此帮助并退出
--version 输出版本信息并退出
常用命令
= 打印当前行号。
a \\ 新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
i \\ 插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
q 立即退出sed脚本,不再处理任何输入,除非自动打印未禁用,否则将打印当前模式空间。
Q 立即退出sed脚本,不再处理任何输入。
r filename 附加从文件名读取的文本。
R filename 附加从文件名中读取的行。该命令的每次调用都从文件中读取一行。
开始一个命令块(以一个结束)。
b label 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;
t label 如果s///在最后一行输入被读取之后,并且在最后一个t或t命令之后,已经成功地进行了替换,那么转移到label;如果标签被省略,分支到脚本的结尾。
T label 如果从最后一行输入和最后一个T或t命令开始,没有s///进行成功的替换,则转移到label;如果标签被省略,分支到脚本的结尾。
c \\ 将选定的行替换为文本,其中每个文本都嵌入了换行符,换行符前面有一个反斜杠。
d 删除,删除选择的行;
D 删除模式空间中第一个内嵌的换行。
h/H 复制/追加模式空间以容纳空间。
g/G 复制/附加保持空间到模式空间。
x 交换hold和模式空间的内容。
l 以“清晰可见”的形式列出当前行。
l width 以“视觉上无歧义”的形式列出当前行,并在宽度字符处断开。
n/N 将下一行输入读入/追加到模式空间。
p 打印当前模式空间。打印,也就是将某个选择的数据打印出来,通常会和sed -n一起运行。
P 打印到当前模式空间的第一个内嵌换行。
s/正则表达式/更换/ 替换,可以直接进行替换工作。通常这个s的动作可以搭配正则表达式!例如1,20s/old/new/g
w filename 写并追加模板块到file末尾;
W filename 写并追加模板块的第一行到file末尾;
y/source/dest/ 将源文件中出现的模式空间中的字符转换为dest中相应的字符。

sed -f b.txt a.txt


>sed的工作方式:命令行上的每个文件名会一次打开于读取。如果没有文件则使用标准输入,文件名"-"(单个破折号)可用于表示标准输入。sed读取每个文件,一次读一行,当多有操作(命令)完成后,sed会将模式空间的最后内容打印到标准输出,再回到开始处,读取另一个输入行。

>sed打印:-n 于p搭配
```SHELL
sed -n aaap   a.txt

2、Sed的其他应用

/oldfunc/   s/$/#xxx:migrate to newfunc/  注释部分源代码
/Tolstoy/ s//& and Camus/g
2.2、完全一致的匹配:自最左边开始匹配、针对每一个子模式、由左至右,必须匹配到最长的可能字符串。
echo Tolstoy is worldly | sed s/T.*y/Camus/

在文本查找时有可能会匹配到Null字符串。而在执行文本时,也允许你插入文本:
echo abc | sed -e s/1*/1/g

以上是关于sed:输入流编辑器的主要内容,如果未能解决你的问题,请参考以下文章

sed命令的使用

shell sed(流编辑器)的基本使用

sed 技巧

sed:输入流编辑器

sed运用

_sed命令