Linux sed 命令
- sed命令整体可以干嘛
- 命令简介
- 样例文本说明
- 查找
- 查找指定行数的内容并打印
- 查找指定关键字所在的行,并打印
- 插入
- 插入空行
- 在指定位置插入内容
- 删除
- 删除指定行
- 删除指定范围的行
- 删除最后一行
- 搜索指定的位置的行
- 删除所有空行
- 替换
- 给文本编号
- 多命令模式
- 一些option参数
- 就地修改-i
- 只输出匹配到的文本-n
- 总结
- 参考资料
sed命令整体可以干嘛
总体而言,sed命令可以对文本进行查找、删除、插入、替换等操作。它跟vim或者vi命令最大的去区别是,后者只能通过人工交互的方式,对文本进行处理。而很多时候,我们希望脚本自动化的进行文本处理,那么sed无疑是我们的好帮手
命令简介
sed OPTIONS [SCRIPT] [INPUTFILE...]
- OPTIONS 用于指定对处理后的文本的一些输出行为,比如
-i
,-n
,后续会详解 - SCRIPT 定义实际的处理行为,比如想要查询什么、删除什么、插入什么
- INPUTFILE 这是具体要被处理的文本。文本还可以来自于管道符,于是命令格式形如下
echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
样例文本说明
为了方便对命令处理效果的说明,首先我们准备一个文本sed_learn.txt
,其内容如下
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
查找
在script中,以p
做为查找输出命令,意即print
查找指定行数的内容并打印
打印1到2行的文本
sed -n '1,2 p' sed_learn.txt
输出结果
unix is great os. unix is opensource. unix is free os.
learn operating system.
上述搜索打印使用到了参数-n
,详细讲解
查找指定关键字所在的行,并打印
打印包含unix
关键字的行sed -n '/unix/p' sed_learn.txt
,输出结果如下
unix is great os. unix is opensource. unix is free os.
unix linux which one you choose.
其中两斜杠/unix/
中间,除了可以指定关键字,还可以指定正则表达式
插入
插入空行
使用G
表示插入空行
-
在每行后面插入空行
sed 'G' sed_learn.txt
结果如下
unix is great os. unix is opensource. unix is free os. learn operating system. unix linux which one you choose.
-
在每行后插入两个空行
sed 'G;G' sed_learn.txt
结果如下为unix is great os. unix is opensource. unix is free os. learn operating system. unix linux which one you choose.
在指定位置插入内容
- 在包含指定关键字的行后面插入新行 :
sed '/love/G' sed_learn.txt
表示在包含love
的行后面插入新行 - 在指定位置插入空格:
sed 's/^/ /' a.txt
表示在所有行前,插入5个空格,^
表示行首
删除
在script中指定d
命令,表示对文本进行相关的删除动作
删除指定行
比如sed '1d' sed_learn.txt
表示删除第一行
删除指定范围的行
sed '1,2d' sed_learn.txt //表示删除1到2行
sed '1,$d' sed_learn.txt //表示删除1到最后一行
删除最后一行
sed '$d' sed_learn.txt
搜索指定的位置的行
sed '/unix/d' sed_learn.txt //表示删除所有包含unix的行
删除所有空行
sed '/^$/d' sed_learn.txt
替换
替换命令的脚本格式一般为sed line_number1,line_number2 's/search_keyword_or_regular_express/string_for_replace/search_range_for_one_line'
-
search_keyword_or_regular_express 指定在一行中匹配的关键字或正则表达式
-
string_for_replace:指定匹配到后,替换的字符。
-
search_range_for_one_line:指定在一行中,搜索匹配的范围。默认只对一行中第一次匹配到的内容进行替换
-
line_number1,line_number2 前面都是对具体某一行的匹配替换行为进行指定,这里指定具体要对哪些行进行匹配替换
-
例如:
sed '1,3 s/unix/linux/' sed_learn.txt
表示,将1到3行中的第一次匹配到unix的地方,替换成linux -
例如:
sed '1,3 s/unix/linux/g' sed_learn.txt
表示,将1到3行中的所有匹配到unix的地方,替换成linux
给文本编号
-
给所有行编号:
sed = sed_learn.txt | sed 'N;s/\n/\t/'
, 其中等号=
是给文本每行前面插入一个带数字的行,由于换行了,所以管道符后面将换行符\n
变成了制表符\t
。 当然我们可以直接换成空格sed = sed_learn.txt | sed 'N;s/\n/ /
-
给非空行编号:
sed '/./=' a.txt | sed '/./N; s/\n/ /'
,通过/./
匹配到所有非空的行,然后使用=
编号。最后,再将换行符\n
替换成空格
多命令模式
在script中,可以指定多组命令,用分号隔开就行
比如sed 'G' sed_learn.txt
,表示插入一个空行
而sed 'G;G' sed_learn.txt
表示插入两个空行
一些option参数
就地修改-i
前面讲的所有查询、删除、替换,都是直接将处理结果输出到终端,为了保留这些处理结果,我们可以使用重定向到某个文件进行保存,比如sed '/unix/d' sed_learn.txt > result.txt
。但我们也可以通过指定-i
参数,直接将修改后的结果,更新到原文件,这里的-i
代表in place
即为就地
的意思
例如sed -i '1,$ s/unix/linux/g' sed_learn.txt
会将sed_learn.txt的内容,直接更新为如下
linux is great os. linux is opensource. linux is free os.
learn operating system.
linux linux which one you choose.
https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/
https://www.geeksforgeeks.org/sed-command-linux-set-2/