sed 命令
NAME
sed - stream editor for filtering and transforming text
SYNOPSIS
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
参数:
a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符。
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
sed 替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。
\1 子串匹配标记。
& 已匹配字符串标记。
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*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\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
示例:
替换操作
sed 's/root/rooot/' passwd //单条替换
sed 's/root/rooot/N' passwd //替换第N个
sed 's/root/rooot/g' passwd //全部替换
sed 's/root/rooot/Ng' passwd //从第N个开始替换
sed -n 's/root/rooot/p' passwd //仅打印替换成功的行
sed '2c hello,world' passwd //替换第二行
sed '1,2c hello,world' passwd //替换1-2行为新文本
sed '/rooot/{s/root/12345/}' passwd //匹配到rooot的行将root替换成12345
sed -i 's/root/rooot/' passwd //将更改应用于文件
删除操作
sed '/^$/d' passwd //删除空行
sed '2d' passwd //删除第2行
sed '2,$d' passwd //删除2至末尾所有行
sed '$d' passwd //删除最后一行
sed '/^root/d' passwd //删除所有root开头的行
已匹配字符标记&
sed 's/root/[&]/g' passwd
子串匹配标记\1
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
多个表达式组合
sed '表达式' | sed '表达式'
等价于:
sed '表达式; 表达式'
引用
test=hello
echo hello WORLD | sed "s/$test/HELLO/"
选定行的范围:,
sed -n '/root/,/lp/p' passwd //打印匹配root至lp范围内的所有行
sed -n '2,/^bin/p' passwd //打印第二行开始以bin开头的所有行
sed '/^bin/,/lp/s/$/aaa bbb/' passwd //替换匹配以bin开头至lp范围的所有结束符为aaa bbb
多点编辑:e
sed -e '3d' -e 's/rooot/12345/' passwd //执行多个sed命令
从文件读入:r
sed '/^bin/r passwd01' passwd //匹配以bin开头的行后面显示passwd01内容
写入文件:w
sed -n '/^bin/w passwd02' passwd //匹配以bin开头的行写入到passwd02文件中
追加:\a
插入(行的上面):\i
sed '1i\hello,world' passwd //在第一行上面插入
下一个: n
sed '/root/{ n; s/bin/123/; }' passwd //如果root被匹配则移动到下一行替换bin为123
打印匹配字符串的下一行
sed -n '/^bin/{n;p}' passwd
变形:y
sed '1,3y/bin/BIN/' passwd //将1到3行所有的b i n替换成B I N
退出:q
sed '1q' passwd //打印到第一行退出sed
保持和获取:h命令和G命令
sed -e '/^bin/h' -e '$G' passwd //将匹配到的以bin开头的行在最后一行输出,$ 结束位
保持和互换:h命令和x命令
sed -e '/root/h' -e '/lp/x' passwd //使用包含root的行替换包含lp的行
打印奇数行和偶数行
sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行
或
sed -n '1~2p' test.txt #奇数行
sed -n '2~2p' test.txt #偶数行
赠人玫瑰,手有余香,如果我的文章有幸能够帮到你,麻烦帮忙点下右下角的推荐,谢谢!
作者: imcati
出处: https://www.cnblogs.com/imcati/>
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接