sed-最常用基础知识
基本语法/格式
sed -option 'command script' file
# -option并不总是需要
sed 'command script' file
其中要特别注意 -i
选项,没有带-i选项都只是对出力结果的处理,并没有直接编辑原文件。
# 直接编辑原文件
sed -i 'command script' file.txt
# 没有-i,不会影响原文件
sed 'command script' file.txt
# 有需要可以另存输出结果
sed 'command script' file.txt > file1.txt
有时也许你会发现,例如像sed -s/cat/dog/ file.txt 这样不加引号的命令也能执行,这是因为这个命令中刚好没有空格,虽然偶尔能成功但不适用于大部分命令带空格的情况,所以还是要养成好习惯,给命令加上单引号。
一些常见的option参考
短option (-) | 长option (- -) | 内容 | 注意 |
---|---|---|---|
-f | –file | -f后面跟内容为执行命令的文件,表示执行文件中的命令 | |
-e script | –expression=script | 添加执行的命令,通过并列多个-e script可一次执行多个命令 | |
-i | –in-place | 直接编辑文件 | |
-i后缀词 | –in-place=后缀词 | 直接编辑文件同时,生成加上指定后缀的原文件备份。例,-i.bak 会将原文件备份为test.txt.bak 。 | 注意-i 和后缀词之间没有空格。 |
-n | –quiet,–silent | 不打印 命令所涉及行 以外的行 (只打印受影响的行) |
执行sed命令文件
就像上面option参考表格中写到,-f
是使用命令文件的选项,-f
后面要跟一个写好命令的文件。
语法
# scriptfile是写有命令的文件,file是被命令操作的文件对象
sed -f scriptfile file
例,
$ cat copy.txt
cat cat
cat cat
# command.txt 的内容为将第一行的cat换为dog的命令
$ cat command.txt
1s/cat/dog/g
# 执行这个文件里的命令(并没有对原文件进行直接编辑)
$ sed -f command.txt copy.txt
dog dog
cat cat
字符串的替换
关于字符串替换的内容,总结在这篇博客文章里了。
sed 字符串替换 csdn文章链接
输出指定的行
话题相关
这个操作可以回答如下问题
#linux 如何输出文件指定行
#shell 如何输出文件指定行
#sed 输出文件指定行
语法
# 打印第5行
sed -n '5p' file
-n
,上面option参考表格中也介绍了,在sed后面加 -n,是阻止默认的自动打印模式的选项;
p
,同时在行号后写p,表明打印print/输出。
具体来说,
# 打印输出第5行
sed -n '5p' test.txt
# 打印输出第3,4行
sed -n '3,4p' test.txt
# 除去第5行,打印输出
sed -n '5!p' test.txt
# 除去第3,4行,打印输出
sed -n '3,4!p' test.txt
# 输出含有hello的行
sed -n '/hello/p' test.txt
# 输出 除了含有hello的行
sed -n '/hello/!p' test.txt
其中,sed -n ‘5!p’ test.txt 与接下来要说的删除指定行d命令的 sed ‘5d’ test.txt是同效果的。
使用正则表达式
语法
# 用逗号隔开选定范围的开始与结束
sed -n '/cat/,/dog/p' test.txt
意为,打印从含有第一个含有cat的行开始,到第一个含有dog的行。
添加插入文本
关于用sed添加插入文本的内容,总结在这篇博客文章里了。
sed 插入文本 csdn文章链接
删除指定行
话题相关
这个操作可以回答如下问题
#linux 如何删除文件指定行
#shell 如何删除文件指定行
#sed 删除文件指定行
语法
用d
来表示删除
# 删除原文件第2行后输出(并没有对原文件进行直接编辑)
sed '2d' file
具体来说,
# 输出除了第二行以外的行
sed '2d' test.txt
# 删除第3行到第5行
sed '3,5d' test.txt
# 删除第3行到最后一行以后输出 $为最后一行
sed '3,$d' test.txt
# 只输出第3行;以下两个写法等效
sed '3!d' test.txt
sed -n '3p' test.txt
# 删除含有hello的行
sed '/hello/d' test.txt
# 删除 除了含有hello的行
sed '/hello/!d' test.txt
# 删除第1行,且删除第3行到最后一行以后输出; 以下两个写法等效
sed '1d;3,$d' test.txt
sed -e '1d' -e '3,$d' test.txt
退出/停止
话题相关
这个q
命令操作可以回答如下问题
#linux 如何打印文档前10行
#shell 如何只输出文件前10行
语法
退出sed,用q
命令
# 打印到第10行,停止;即打印前10行
sed '10q' file
# 与正则表达式结合
# 打印到第一个abc所在的行,停止
sed '/abc/q' file
(以上。)