linux sed命令
sed简介
sed是一个流(stream)编辑器,每次读取文本中的一行,放到内存的缓冲区(pattern space),然后使用sed命令处理pattern space中的内容,处理完成后,默认输出至屏幕(stdout)。随后处理下一行数据。
sed工作特性
- 不直接编辑源文件,拷贝一份至pattern space,在内存中处理pattern space 中的内容。
- 处理结果默认输出至stdout。
注意:实际上sed还有一个holdspace,上图只是其基本的流程
sed 使用方法
sed [OPTION] 'script' [input-file]……
OPTION:
-n:slient静默模式,一般情况下,来自标准输入(stdin)的数据,默认输出至屏幕(stdout)。但是加上-n后,则只有经过sed 特殊处理的内容才会被列出来。、
-e script:多点编辑,对一行数据进行多个编辑命令。
-f /PATH/TO/SED_SCRIPT_FILE:使用脚本处理数据。脚本中每一行为一个编辑命令。
-r:支持扩展的正则表达式。
-i[SUFFIX]:直接编辑原文件。
script:script中内容是‘地址定界编辑命令’ (地址定界后直接跟编辑命令)。
地址定界:空地址、单地址、范围地址、地址步进
空地址:不给地址默认为全文处理。
单地址:
#:指定某一行。
/pattern/:模式匹配行。
范围地址:
ns,nd:从ns行到nd行。
ns,/pattern/:从ns行到pattern匹配到的行。
ns,+#:从ns行开始偏移#行。
/pattern1/,/pattern2/:从pat1到pat2匹配的行。
地址步进:~
1~2:从第一行开始,步进2,即所有奇数行。
编辑命令:
d:删除模式空间中的内容——删除后输出模式空间内容至默认输出
使用-n选项后不会输出任何内容。因为被sed处理过的内容已经被删除,-n又不输出没有被处理过的内容。
p:打印模式空间中的内容。通常 p 会与参数 sed -n 一起运行,只输出sed处理过的内容
打印了两次3,4行的内容,第一次输出的“# /etc/fstab”是默认输出,第二次输出的“# /etc/fstab”,是sed读取文件内容到第三行是会被p命令
(打印)处理。所以会有两行。
使用-n,屏蔽了默认输出,至输出被sed处理过的内容。
a \text:追加,在匹配行后追加一行新的数据为\text的行。可使用\n实现追加多行。
第一行为空行,新加一行在第二行。
使用\n实现多行插入。
i \text:插入,在匹配的行前插入一行新的数据为\text的行。可使用\n实现追加多行。
第一行为空行,新加的一行在空行前插入。
使用\n实现多行插入。
c\text:把匹配到的行替换成为\test的内容。
将开头为#的行替换成为null。
使用-e参数来对同一数据进行多次处理。
w /PATH/TO/SOMEFILE:保存模式空间中的内容至指定文件中
首先删除以#开头的行然后将剩余内容输出至一个文件
r /PATH/FROM/SOMEFILE:读取指定文件内容至当前文件被匹配到的行后,以实现文件合并。
把/etc/issue 文件内容添加到 /etc/fstab 第一行后。
=:在被匹配的行的前一行插入行号
在第1-3行插入行号。
!:条件取反,!要写在模式后边编辑命令前面——地址定界!编辑命令。
删除所有非#开头的行。
s///:查找替换,分隔符可自行指定,常用的有s@@@,s###等。
替换标记:
g:全局替换。
w:将替换成功的结果保存至指定文件中。
p:显示替换成功的行。
补充正则表达式元字符(引用于https://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2456968.html)
练习一:删除/boot/grub/grub.conf 文件中以空格开头的空白字符
sed ‘s@^[[:space]]\+@@’ /boot/grub/grub.conf
练习二:删除/etc/fstab文件中所有以#开头的行首的#号及#号后的所有空白字符
sed 's@^#[[:space]]*@@' /etc/fstab
练习三:输出一个绝对路径给sed,取出其基目录。
echo "/var/log/messages" |sed 's@[^/]\+$@@'
echo "/var/log/messages/ |sed 's@ [^/]\+/?@@'
posted on 2018-06-05 19:16 HowOldAreYou 阅读(297) 评论(0) 编辑 收藏 举报