共计 2478 个字符,预计需要花费 7 分钟才能阅读完成。
这篇文章给大家分享的是有关 shell 中 sed 怎么用的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
1. 首先先来了解一下什么是 sed?
sed 叫做流编辑器,在 shell 脚本和 Makefile 中作为过滤器使用非常普遍,也就是把前一个程序的输出引入 sed 的输入,经过一系列编辑命令转换成为另一种格式输出。下面我们通过一张原理图来了解一下它的工作模式:
编辑命令的格式为,sed /pattern/action
经过 sed 处理后文件内容并没有改变,除⾮使用重定向存储输出。sed 主要用来自动编辑一个或多个文件; 简化对文件的反复操作;sed 默认按照 Basic 规范基本匹配! 也就是说类似于() {} | 等特殊字符需转义,否则就不识别,或者是用扩展模式也可以。
2. 下面重点介绍一下有关 sed 的参数及 action 的操作方法
(1)- n 参数,p 命令的 action
(2) d 命令的 action
(3)/pattern/s/pattern1/pattern2/:查找符合 pattern 的行, 将该行 *** 个匹配 pattern1 的字符串替换为 pattern2
/pattern/s/pattern1/pattern2/g:查找符合 pattern 的行, 将该行所有匹配 pattern1 的字符串替换为 pattern2
这个操作不知道大家会不会联想到 vim 编辑器中的底行模式搜索,它们是类似的。
下面总结一下 sed 中参数的选择及执行操作:
[plain] view plain copy
strong 参数选择:
-n: 一般 sed 命令会把所有数据都输出到屏幕,如果加入 - n 选项的话,则只会把经过 sed 命令处理的行输出到屏幕。
-e: 允许对输入数据应用多条 sed 命令编辑。
-i: 将修改结果直接写入到读取数据的文件,而不是由屏幕输出。(1. 修改了文件; 2. 由 cat 可查看)
-f: 指定 sed 脚本的文件名。
action:
a: 追加,在当前行后添加一行或多行。
c: 行替换,用 c 后面的字符串替换原数据行。
i: 插入,在当前行前插入一行或多行。
p: 打印,输出指定的行。
s: 字符串替换,用一个字符串替换另外一个字符串。格式为”行范围 s / 旧字符串 / 新字符串 /g”(如果不加 g 的话,则表示只替换每行 *** 个匹配的串)。
/strong
以上没有练习到的,有兴趣的可以去尝试尝试!
3. 再来介绍一下 sed 中的定址
定址用于决定对文件中哪些行进行行编辑,地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed 将处理输入文件的所有行。下面举一些例子:
sed /start/ ,/end/d file #删除包含 rsquo;start rsquo; 行和 rsquo;end rsquo; 行之间的行
sed /start/, 10d file #删除包含 rsquo;start rsquo; 的行到第十行的内容
4. 模式空间和保持空间
(1)保持空间: 用来存储数据,相当于一个仓库,它不能对数据进行处理 ;
(2)模式空间: 专门以行为单位对数据进行处理。
一般情况下,如果不显示的使用一些选项的话,是不会用到保持空间的。
[plain] view plain copy
span >
g: 将保持空间的内容拷贝到模式空间中,会将模式空间原来的值覆盖掉。
G: 将保持空间的内容追加到模式空间中。
h: 将模式空间的值拷贝到保持空间,会将保持空间原来的值覆盖掉。
H: 将模式空间的值追加到保持空间中。
d: 删除模式空间的所有行,并读下一行到模式空间。
D: 删除模式空间的 *** 行,不读下一行到模式空间。
n: 输出模式空间的行,读取下一行替换当前模式空间的行,接着执行下一条处理命令而不是 *** 条命令。
N: 读入下一行,追加到模式空间行后面,此时模式空间中有两行。
x: 交换模式空间和保持空间的内容。
/strong /span
例 1:给每行后面添加一行空行
例 2:用 sed 模拟倒序 (tac) 打印的过程
例 3. 追加匹配行到文件末尾
例 4:将一列内容变为一行
例 5:求出 1 -100 的求和
例 6:打印输出奇数行和偶数行
5. 使用标签
[plain] view plain copy
:a 表示标签 a;
ba 表示跳转到 a 标签;
$ 表示 *** 一行;
! 表示不做后续操作
所以,$!ba 表示 *** 一行不用跳转到 a 标签,结束此次操作。
下面举一个例子:
*** 补充一点:
[plain] view plain copy
与 grep 一样,sed 也支持特殊元字符来进行模式查找、替换。不同的是,sed 使用的正则表达式是括在斜杠线 / 之间的模式。
如果要把正则表达式分隔符 / 改为另一个字符,比如 o,只要在这个字符前加一个反斜线,在字符后跟上正则表达式,再跟上这个字符即可。例如:sed -n \o^56op datafile
^:行首定位符 /^my/ 匹配所有以 my 开头的行;
$:行尾定位符 /my$/ 匹配所有以 my 结尾的行;
.:匹配除换行符以外的单个字符 /m..y/ 匹配包含字母 m,后跟两个任意字符,再跟字母 y 的行;
*:匹配零个或多个前导字符 /test*/ 匹配包含字符串 tes, 后跟零个或多个 t 字母的行;
[]:匹配指定字符组内的任一字符 /t[eE]st/ 匹配包含 test 或 tEst 的行;
[^]:匹配不在指定字符组内的任一字符 /t[^eE]st/ 匹配 string 以 t 开头,但 st 之前的那个字符不是 e 或 E 的行;
:保存查找串以便在替换串中引用 s/test/* */g 符号 代表查找串。test 将被替换为 *test*
\:词⾸首定位符 /\ my/ 匹配包含以 my 开头的单词的行;
\:词尾定位符 /my\ / 匹配包含以 my 结尾的单词的行;
x\{m\}:连续 m 个 x 如:/9\{5\}/ 匹配包含连续 5 个 9 的行;
x\{m,\}:至少 m 个 x 如:/9\{5,\}/ 匹配包含至少连续 5 个 9 的行;
x\{m,n\}:至少 m 个,但不超过 n 个 x 如:/9\{5,7\}/ 匹配包含连续 5 到 7 个 9 的行。还有一个单元匹配 – 替换的问题:
感谢各位的阅读!关于“shell 中 sed 怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!