sed命令
简述
- sed:流编辑器,可依照脚本的指令来处理、编辑文本文件。
- sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed参数
-e <script> :以指定的script来处理输入的文本文件,并在控制台显示。
-f <script文件> :以指定的script文件来处理输入的文本文件。
-n :仅显示script处理后的结果,一般跟p动作搭配使用。
-i :直接修改文本文件,不会在控制台显示。
sed脚本
script动作
a :在指定行后面插入内容
i :在指定行前面插入内容
d :删除指定行
c :替换指定行
p :打印指定行的数据,通常需要跟-n选项搭配使用
s :替换指定字符
y :单字符替换
script的正则语法
^ :行的开始 如:/^sed/匹配所有以sed开头的行。
$ :行的结束 如:/sed$/匹配所有以sed结尾的行。
. :匹配一个非换行符的任意字符 如:/s.d/匹配s后接一个任意字符,然后是d。
* :匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] :匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^] :匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\):保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
& :保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< :单词的开始,如:/<love/匹配包含以love开头的单词的行。
\> :单词的结束,如/love>/匹配包含以love结尾的单词的行。
x\+ :重复字符x,至少1次,如:/o\+/匹配至少有1个o的行。
x\{m\} :重复字符x,m次,如:/o\{5\}/匹配包含5个o的行。
x\{m,\} :重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\} :重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5-10个o的行。
实践
-e
a:
sed –e 2a\newline testfile
cat testfile | sed '2a\newfile' # 默认省略-e
i:
cat testfile | sed '2i\newline'
d:
nl /etc/passwd | sed '3,$d' # 删除第三到最后一行
nl /etc/passwd | sed '/\/usr\/sbin\/nologin/d' # \为转义符,取消/作为分隔模式的特殊含义
c:
nl /etc/passwd | sed '2,$c No 2-5 number'
# 没有分隔符(/)要求
# 将第2行到结尾行替换为No 2-5 number,只显示这行
s:
ifconfig | grep 'inet ' | sed 's/^[^0-9]*\([0-9\.]*\).*$/\1/g'
# \1表示第一个括号内的匹配内容
# ^[^0-9]*\([0-9\.]*\):inet 127.0.0.1
# ^[^0-9]*:匹配字符串开始到第一个数字或点号(.)之前的所有字符
# \([0-9\.]*\):匹配一个或多个数字或点号(.),这部分内容被括号包围,因此可以通过\1来引用
# .*$:匹配从该数字或点号开始到字符串结束的所有字符
# g:全局替换
cat testfile | sed '/^Linux/,/^This/s/$/--sed test/'
# 给以Linux和This开头的行,末尾添加—sed test
# g默认,可省略
y:
echo "axxbxxcxx" | sed 'y/abc/123/' # 将字母abc替换为123
多点编辑:
nl /etc/passwd | sed –e '3,$d' –e 's/bash/blueshell/'
nl /etc/passwd | sed '3,$d;s/bash/blueshell/' # 简写
sed –e '/^#/d' –e '/^$/d' log.txt # 删除文件中的#和空行
-n
p:仅显示指定行
nl /etc/passwd | sed –n '5,7p' # 显示5-7行
nl /etc/passwd | sed –n '/root/p' # 显示有root的行
cat /etc/passwd | sed –n '/^root/,/^bin/p' # 显示以root开头和以bin开头的行
nl /etc/passwd | sed –n '5,\/sbin\/nologin/p' # 显示从第5行到包含/sbin/nologin的行
-i
sed –i 's/\!$/\./g' testfile # 不会在控制台输出
cat testfile
模式空间&保持空间
- 模式空间是sed处理文本的临时空间,处理完成后会输出到标准输出
- 保持空间是sed的另一个临时空间,用来保存临时的数据
# 解析
h :将当前模式空间中内容覆盖至保持空间
H :将当前模式空间中的内容追加至保持空间
g :将当前保持空间中内容覆盖至模式空间
G :将当前保持空间中的内容追加至模式空间
# 例子
cat log.txt | sed –e '1!G;h;$!d' # 将文件内容倒序输出
seq 3 | sed 'H;g' # 递增序列