linux三剑客之编辑器sed出厂

持续创作,加速成长!这是我参与「掘金日新计划 · 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 新增,在指定行后新增数据

image-20220611110536430.png

  • 通过图中我们能够看出来-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}' 组合扩展;分号切割
  • 在mac中我们使用编辑模式新增内容时需要如下操作

a

image-20220613164113139.png

i

image-20220613164814557.png

c

image-20220613164752991.png

d

image-20220613173534545.png

l

image-20220613174737375.png

{}

image-20220613175220746.png

n

image-20220613192123260.png

常用脚本

查询文本中是否包含某内容

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

猜你喜欢

转载自juejin.im/post/7114829129656041509