sed编辑器简单使用(1)

在Linux 运维 管理中免不了 去修改一些文件,用vim ,有时候也可以用一些流编辑器比如sed awk 这些。 本文主要讲解sed 一些基本的用法。好了让我们开始吧。
        sed基于 编辑器被称作流编辑器,跟普通交互式编辑器恰好相反。 在交互文本编辑器中(如vim),你可以 用键盘名利来交互式地插入,删除或者替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则编辑数据流。
       sed编辑器可以基于到命令行的,或是存储在命令文本中的命令来处理数据流中的数据。它每次从输入中读取一行,用提供的编辑器命令匹配数据, 按命令中指定的方式来修改流中的数据,然后将生成的数据到STDOUT. 在流编辑器将所有的命令与一行数据进行匹配后, 它会读 取下一行数据并重复这个过程。 在流编辑器处理流中所有的数据后,它就会终止。

平常工作中可能用的最多的是 sed 替换功能了。好了,我来上一些例子.


比如 把 dog 替换为 cat , 很简单, sed 's/dog/cat/' data5
[root@myCentOS shell]# cat data5
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog. I am a beautiful dog.
The quick brown fox jumps over the lazy dog

sed 's/dog/cat/' data5
[root@myCentOS shell]# sed 's/dog/cat/' data5,
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat. I am a beautiful dog.
The quick brown fox jumps over the lazy cat
这样写 的话,默认 只会替换 每行中第一次出现的 dog, 所以 第二行的第二个 dog 就没有被替换。

[root@myCentOS shell]# sed 's/dog/cat/2' data5
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog. I am a beautiful cat.
The quick brown fox jumps over the lazy dog
这里数字 2 ,就是说 只替换 每行中 第二次出现的匹配模式, 所以 第二行的 dog 就被 替换了,其他行的dog 依然在。


现在 我来修改 data5
[root@myCentOS sedtest]# cat data5
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog. I am a beautiful dog. I am a beautiful single dog I am a beautiful single dog.
The quick brown fox jumps over the lazy dog
再来测试看一下。
[root@myCentOS sedtest]# sed 's/dog/cat/2' data5
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog. I am a beautiful cat. I am a beautiful single dog I am a beautiful single dog.
The quick brown fox jumps over the lazy dog

发现 第二行,第三次 出现的dog 并没有被替换掉, 所以 这个数字2 ,就是可以指定 每行中出现第二次的时候才替换, 其他情况 1,3,4次 不会替换。
下面 问题来了,如果想要全部替换,该怎么办呢? 那就是把 最后的2 换为 g , 即全局替换。

[root@myCentOS shell]# sed 's/dog/cat/g' data5
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat. I am a beautiful cat. I am a beautiful single cat.
The quick brown fox jumps over the lazy cat

如果 想 全部替换 ,用g 就可以,相信大家都比较熟悉了。

其实 sed 中 还有一个选项,可能 大家平常用的 不是特别的多。 那就是w 选项。
这个命令的格式:
sed 's /old/new/w file' data5
直接 上看例子 ,
把 dog 替换为cat , 仅仅替换第一次出现的 dog .

[root@myCentOS shell]# sed 's/dog/cat/w test' data5
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat. I am a beautiful dog. I am a beautiful single dog.
The quick brown fox jumps over the lazy cat

此时 在脚本的当前目录下会生成 一个文件 test ,里面的 内容就是 打印在stdout 上面的内容,也是把 结果记录到test 文件中了。

当然 也可以加一些参数进来,比如 全部替换。
[root@myCentOS shell]# sed 's/dog/cat/g w /tmp/test' data5
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat. I am a beautiful cat. I am a beautiful single cat.
The quick brown fox jumps over the lazy cat

[root@myCentOS shell]# cat /tmp/test
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat. I am a beautiful cat. I am a beautiful single cat.
The quick brown fox jumps over the lazy cat


一般情况 sed 还有一个 -n 也比较好,禁止 输出的意思。一般 喜欢 和p 在一起 搞事情。
来举个简单例子。

[root@myCentOS shell]# sed 's/dog/cat/2 ' data5
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog. I am a beautiful cat. I am a beautiful single dog.
The quick brown fox jumps over the lazy dog
默认 sed 会把 每一行都打印 ,不管匹配有没有成功,都会打印出来。

[root@myCentOS shell]# sed 's/dog/cat/2 p ' data5
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog. I am a beautiful cat. I am a beautiful single dog.
The quick brown fox jumps over the lazy dog. I am a beautiful cat. I am a beautiful single dog.
The quick brown fox jumps over the lazy dog
第二行打印了两次,第一次默认输出的, 第二次 是 匹配成功后,p 输出的。


但是想让输出一次,该怎么办呢? 这个时候就要用 -n 选项。

[root@myCentOS shell]# sed -n 's/dog/cat/2 p ' data5
The quick brown fox jumps over the lazy dog. I am a beautiful cat. I am a beautiful single dog.

-n 禁止sed 输出,这样写 ,只有匹配行,才有资格输出到屏幕上来。


sed 中替换一些 含有特殊字符的时候。
sed 有时候 会遇到 替换的 字符串 有时候含有 特殊字符 比如:
/bin/bash 替换为 /bin/dash
这个时候 ,就不能 用/ 作为分割符, 我们可以用 # ! 这样的符号作为分隔符
下面举例说明:
[root@myCentOS shell]# cat data6
#!/bin/bash
[root@myCentOS shell]# sed 's#/bin/bash#/bin/dash#' data6
#!/bin/dash
[root@myCentOS shell]# sed 's!/bin/bash!/bin/dash!' data6
#!/bin/dash


以上的替换 ,并没有直接修改文件的内容,只是在 stdout 显示出来 ,看到替换的效果,如果想直接修改文件的内容 可以用 -i 选项,
如 sed -i 's/dog/cat/' data5


小结: sed 's/old/new/flags' 还可以 加一些选项 例如 -n
关于 flags 大概 有4种:
1 数字 , 仅匹配 某行中 第几次 出现的模式。
2 p 输出
3 g 全局替换
4 w 将替换后的文件,进行 输出到 文件中
sed -n 禁止 输出 选项
-n, --quiet, --silent 取消自动打印模式空间
sed 有时候替换 含有特殊字符的字符串的时候,可以用 # ! 来代替 / 完成替换。



分享快乐,留住感动。你的点赞,就是我写作的最大的动力.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值