持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
sed
- linux三剑客grep、sed、awk 。不知道你了解多少?今天我们来聊聊三剑客之一的sed。
- 我们可以将sed理解成一种编辑器。sed只是针对文件进行编辑并将结果输出在终端。整个过程对源文件是不会做任何修改的。所以sed在某种程度上来说可以说是没有破坏性的。但是sed又提供重定向来保存结果,这个操作有可能破坏源文件。
语法结构
参考
参考2
命令模式
sed [option] 'sed command' filename
脚本模式
sed [option] -f 'sed script' filename
option列表
参数 |
含义 |
-n |
仅将匹配的行打印出来 |
-e |
命令模式编辑内容,不影响源文件 |
-f |
将sed命令提前写在文件中。-f进行加载 |
--follow-symlinks |
直接修改文件时跟随软链接 |
-r |
支持扩展模式 ; 同grep -E |
-i |
修改源文件内容。如果需要备份则-i "filename" 表示备份到filename文件 |
-a |
新增,在指定行后新增数据 |

- 通过图中我们能够看出来-e模式针对文本进行修改只是针对终端的。上面我们文本内容为hello。 -e模式先将hello修改为zxh,然后在修改为nihao。但是源文件并没有修改
- 上面是sed的命令参数。在命令参数比如-i , -a需要编辑数据时,sed还提供了定位功能。下面我们简称编辑命令。
编辑命令 |
事例 |
功能 |
a |
sed '3a\content' demo.txt 或者sed '$a\content' demo.txt |
指定行后增加内容;3a表示第三行,$a最后一行。在ma c中\后面需要换行。 |
i |
sed '3i\content' demo.txt |
指定行之前新增内容 |
c |
sed '3c\hello' demo.txt |
修改指定行 |
d |
sed '/number 1/,/number 3/d' data.txt |
删除文本流中的特定行 |
n |
sed '/content/n' demo.txt |
移动到选中的下一行 |
p |
sed -n '2p' demo.txt |
打印数据。-n禁止,p 结合使用输出匹配行 |
s |
sed '2,$s/dog/cat/' demo.txt |
将内容替换成新内容 |
g |
sed 's/dog/cat/g'demo.txt |
也是替换内容。全局替换 s前指定范围。g全局 |
y |
sed 'y/abc/ABC'demo.txt |
唯一可以处理单个字符的sed编辑器命令a-A,b-B,c-C |
w |
sed '1,2w test.txt' demo.txt |
write 。将流内容写出到指定文件中 ; 将demo.txt1,2行数据写入test.txt |
r |
sed '1,2r test.txt' demo.txt |
read。将文件内容读到流中 |
l |
sed -n 'l' demo.txt |
列表显示 |
= |
sed -n '=' demo.txt |
打印行号 |
{} |
sed -n '{=;s/dog/cat/g;p}' |
组合扩展;分号切割 |
a

i

c

d

l

{}

n

常用脚本
查询文本中是否包含某内容
echo /bin/bashtesth | sed -n '%/bin/bash% p'
正则查找某内容
echo helloworld | sed -n '/^hell/ p'
echo helloworld | sed -n '/ld$/ p'
查找2,4行数据
cat demo.txt | sed -n '2,4p'
正则匹配
- 作为新手的我总感觉Linux中的正则和Java中正则有点不太一样。Linux里正则用着不是很舒服。
.*^${}+?|()
这些和java一样都是特殊字符。
- java中匹配所有事
.*
而Linux中.
直接就可以匹配所有
- [] 匹配指定范围内任意字符
- [^] 匹配出指定范围外任意字符
echo 12345 | sed -n '/[0-9]+/p'
这个并不能匹配;echo 12345|sed -n '/[0-9][0-9][0-9][0-9][0-9]/p'
可以匹配。这是因为sed和grep一样需要-E
开启扩展正则echo 12345 | sed -n =E '/[0-9]+/p'
特殊含义 |
解释 |
[[:alpha:]] |
匹配任意字母字符,不管是大写还是小写(等价于[a-zA-Z]) |
[[:alnum:]] |
匹配任意字母数字字符09、AZ或a~z(等价于A-Za-z0-9) |
[[:blank:]] |
匹配空格或制表符 |
[[:digit:]] |
匹配0~9之间的数字(等价于[0-9]) |
[[:lower:]] |
匹配小写字母字符a~z(等价于[a-z]) |
[[:print:]] |
匹配任意可打印字符 |
[[:punct:]] |
匹配标点符号 |
[[:space:]] |
匹配任意空白字符:空格、制表符、NL、FF、VT和CR |
[[:upper:]] |
匹配任意大写字母字符A~Z(等价于[A-Z]) |
三剑客还剩下一位grep ; 江湖有缘再见