文章目录
sed是一个流编辑器,用于对文件或输入流执行各种文本转换,功能强大且效率高。
主要用于对数据行进行替换、删除、新增、修改等。
一、sed 语法格式
sed [-nefri] 'command' 输入文本
参数选项
常见参数 | 说明 |
---|
-n | 抑制输出,结合p 指令打印特定行。 默认sed会列出所有指定内容,加上 -n 参数后,则只有经过sed 特殊处理的那一行才会被列出来。 |
-i | 直接修改文件内容,而且不进行任何输出,慎用! 默认情况下 sed 并不直接修改文件内容,只是把结果进行标准输出,文件内容实际没有变化。 |
-e | 使用后面的动作指令编辑文件内容 |
-f | 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作; |
动作指令
使用时要用单引号把动作指令内容括起来;
若指令内容包含变量,则用双引号括起来。
常用动作 | 说明 |
---|
p | print,打印,列出指定的内容,通常与 -n 参数一起使用 |
a | after,新增,后面接字符串,并显示在新的一行(目前的下一行) |
i | insert,插入, 后面接字符串,并显示在新的一行(目前的上一行) |
c | change,替换一行或多行的整行内容,后面接字符串,用于取代 n1,n2 之间的行 |
s | supersede,stead,替换一行或多行中的部分内容,通常搭配正规表达式 常用方式: 1,20s/old/new/g |
d | delete,删除,后面通常不接任何字符 |
二、参数使用举例
(假设我们有一文件名为input)
1、输入文件的几种方式
sed 命令中的文件参数可以是文件名,也可以是来自管道的输入。
下面几种方式是等价的:
sed 's/hello/world/g' input > output
sed 's/hello/world/g' < input> output
cat input | sed 's/hello/world/g' - > output
cat input | sed 's/hello/world/g' > output # - 可以省略
2、-n 抑制输出
默认情况下,sed打印所有已处理的输入(已通过命令修改/删除的输入除外)。
使用 -n 抑制输出,结合p
指令可以打印特定行。
仅打印输入文件的第45行:
sed -n '45p' input
3、-i 修改文件内容且不进行输出
查看input文件原内容:
$ cat input
hello ehllo hello
hello abadbsabf
a123gdsgahello
sed 不带 -i 参数时进行替换指令
会输出替换后的结果,且再次查看input内容,原文件未修改。
# sed 替换
$ sed 's/hello/world/' input
world ehllo hello
world abadbsabf
a123gdsgaworld
# 查看input内容,并未真正修改
$ cat input
hello ehllo hello
hello abadbsabf
a123gdsgahello
sed -i 进行替换指令
不会输出任何内容,且再次查看input内容,原文件直接被修改了。
$ sed -i 's/hello/world/' input
$ cat input
world ehllo hello
world abadbsabf
a123gdsgaworld
sed -i 使用正则表达式匹配
$ cat input.txt
google.
taobao.
zhihu-
$ sed -i 's/\.$/\!/g' input.txt
$ cat input.txt
google!
taobao!
zhihu-
(这个命令把选项 -i 和指令 a 结合使用,同时其中 $ 代表最后一行,从而实现直接修改文件,在最后一行后面新增内容。)
$ sed -i '$a # This is a test' input.txt
$ cat input.txt
google!
taobao!
zhihu-
# This is a test
4、-e 和 -f 指定脚本
4.1 语法:
-e 指定动作集(两种方式一样):
-e script
–expression=script
-f 指定动作文件(两种方式一样):
-f script-file
–file=script-file
4.2 下面几种示例是等价的:
sed 's/hello/world/' input.txt > output.txt
sed -e 's/hello/world/' input.txt > output.txt
sed --expression='s/hello/world/' input.txt > output.txt
echo 's/hello/world/' > myscript.sed
sed -f myscript.sed input.txt > output.txt
sed --file=myscript.sed input.txt > output.txt
style='box-sizing: border-box; outl