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 ; 江湖有缘再见