Linux-sed命令
sed(Stream EDitor):流编辑器,是一个非交互式命令行文本编辑器。用于在一个输入流(一个文件或者管道上的输入)上执行基本文本的转换
语法
完整的sed命令格式
sed OPTIONS ...[SCRIPT] [INPUTFILE...]
OPTIONS:表示选项
SCRIPT:表示脚本,脚本由地址(addr)、命令(options)两部分组成。地址就是地址范围,命令仅在匹配的行上执行
INPUTFILE:输入文件或者管道上的输入
eg:
替换input.txt文件中所有"hello"转变为"one"
INPUTFILE为输入文件,且输出到终端窗口(标准输出)
sed 's/hello/one/g' 'input.txt'
INPUTFILE为管道上的输入,且输出到output.txt(标准输出重定向到output.txt文件,覆盖output.txt的内容)
cat input.txt |sed 's/hello/one/g' > 'output.txt'
常用的命令行选项
--version
打印sed版本
--help
打印命令行选项的用法
-n
--quiet
--silent
取消打印模式空间的内容,即不输出文本转换结果到终端窗口
-e SCRIPT
--expression=SCRIPT
添加脚本命令,在处理输入时执行
-f SCRIPT-FILE
--file=SCRIPT-FILE
添加脚本文件,在处理输入时执行
-i[SUFFIX]
--in-place[=SUFFIX]
就地修改文件,将文本转换结果输出到原文件中,SUFFIX可选,用来备份之前文件中的内容
eg:
替换input.txt文件中所有"hello"转变为"one",并且将原文件备份到当前路径下
sed -i./*.bak 's/hello/one/g' input.txt
如果sed命令行中没有给出 -e | --expression 或 -f | --file 的选项,会将第一个非选项参数作为需要执行的脚本(SCRIPT)
如果在处理上述操作后仍有任何命令行参数,这些参数将认为输入文件的名称被处理,文件名为'-'时,表示标准输入流。如果未指定文件名,则处理标准输入
sed脚本
脚本命令格式
[addr]X[options]
X:单个字母的sed命令
addr:可选的地址范围,如果addr被指定,X命令只在匹配的行中执行
options:附加的选项,用于一些sed命令(不常用)
单个字母的sed命令(X)
#
单行注释
q
退出sed,无需处理更多的命令或输入
eg: 打印第二行后退出
sed '2q' input.txt
d
删除模型空间
eg: 删除第二行输入
sed '2d' input.txt
p
打印模型空间
eg: 仅打印第二行输入
sed '2d' input.txt
n
如果未禁用自动打印,则打印模型空间,之后将模型空间替换为下一行输入,如果没有更多输入,则退出sed
eg:
每3行执行替换命令
sed 'n;n;s/./x/'
a text
或
a \text
在每一行后附加text文本
eg: 在第二行后附加空格test文本
sed '2a\ test' input.txt
i text
或
i \text
在每一行前附加text文本
eg: 在第二行前附加空格test文本
sed '2i\ test' input.txt
c text
或
c \text
将每一行替换为text文本
eg: 将第二行替换为空格test文本
sed '2c\ test' input.txt
r filename
将每一行后附加filename文件中的文本
eg: 将第二行后附加out.txt文件中的文本内容
sed '2r out.txt' input.txt
w filename
将每一行的文本输出到filename文件中
eg: 将第二行的文本输出到out.txt文件中
sed '2w out.txt' out.txt
s
文本替换
s命令的格式
's/regexp/replacement/flags'
regexp: 正则表达式
replacement: 替换的文本
flags: 标志(s命令后面可以加零个或多个标志)
flags中有以下几个常用的:
g: 将替换所有正则表达式(regexp)匹配到的文本,不仅仅是每一行中的第一个(默认不加flags是匹配每一行中的第一个)
number: 数字,仅替换第number个匹配的文本
i或I: 忽略大小写,在匹配时忽略正则表达式的大小写(regexp)
w filename: 将替换后的结果写入filename文件中,即将发送替换的行写入文件中,文件名支持/dev/stderr(标准错误)和/dev/stdout(标准输出)
eg:
将input.txt中所有匹配到"hello"的词替换为one
sed 's/hello/one/g' input.txt
将input.txt中每一行的第二次匹配到"hello"的词替换为one
sed 's/hello/one/2' input.txt
将input.txt中匹配到"hello"的词替换为one的行输出到out.txt文件中
sed 's/hello/one/w out.txt' input.txt
可选的地址范围(addr)
number
指定的行数,仅匹配指定的行数
$
最后一个文件的最后一行,仅匹配最后一个文件的最后一行
first~step
first:第一次匹配的行数,step:步长,走step步后匹配
eg: 替换2行以及从2行开始每走2行(每隔1行)进行替换,替换文本为test
sed '2~2 c test' input.txt
/regexp/
正则表达式,匹配与正则表达式匹配的行
eg: 仅打印input.txt文件中以"test"结尾的行到终端窗口
sed -n '/test$/p' input.txt
first,end
从第first行开始匹配到end行(包含)
eg: 仅打印input.txt文件中2-5行的文本内容
sed -n '2,5p' input.txt
sed中的正则表达式语法
char
一个普通字符与自身匹配
*
匹配零个或多个前一个表达式
eg:
'a*b':可以匹配 'b','ab','aaaab'
\+
和*类似,只能匹配一个或多个前一个表达式
\?
和*类似,只能匹配零个或一个前一个表达式
eg:
'a\?b':只能匹配 'b','ab'
.
匹配任意一个字符,包括换行符
eg:
'.*':可以匹配每个字符串,包括空字符串
^
匹配输入字符串开始位置
eg:
'^#':匹配以#号开头的行
$
匹配输入字符串结尾位置
eg:
'\\$':匹配以反斜杠结尾的字符串,两个'\'相当于对'\'做转义
'\$':匹配$字符串,特殊字符前加'\'相对于对特殊字符做转义
[list]
匹配list列表中任何单个字符
eg:
'[ae]':匹配所有带有a或e字符的行
参考网址
GNU软件-sed官方网址:https://www.gnu.org/software/sed/
sed相关博客:https://www.cnblogs.com/alongdidi/p/sed.html