sh/bash/dash/ksh/zsh等Shell脚本
-
leetking
- 帖子: 62
- 注册时间: 2014-10-28 14:53
- 系统: ubuntu-18.04-LTS
#1
帖子
由 leetking » 2016-12-13 22:07
如何使用`sed`程序完成如下功能?
我百度并且查看了overflow,没有查看到能应对解法。如果单单是替换,我知道怎么写,但是需要处理两种情况,我不知道怎么写了。。。
e.g.1
代码: 全选
aaaa
cccc
bbbb
ffff
e.g.2
如何使用`sed`处理文档,文档类似上述两个
第一个
e.g.1
如果存在
bbbb行,把
bbbb替换为
eeee
此时
e.g.1变为如下内容
代码: 全选
aaaa
cccc
eeee
ffff
第二个
e.g.2
如果没有
bbbb,则在
cccc下面添加一行
eeee
变为如下
代码: 全选
aaaa
cccc
eeee
ffff
求教大神如何编写sed脚本
-
b33e
- 帖子: 3864
- 注册时间: 2011-06-07 14:20
- 系统: Mint18
#2
帖子
由 b33e » 2016-12-14 0:25
代码: 全选
sed -i -e '/^bbbb.*/d' -e '/cccc/c\cccc\neeee' file1
这样可以吧,先删除bbbb行,再替换就行。
-
cao627
- 帖子: 992
- 注册时间: 2007-12-05 10:57
- 系统: ubuntu14.04
- 来自: 金山
#3
帖子
由 cao627 » 2016-12-14 19:25
代码: 全选
sed '/cccc/N;/bbbb/!s/\n/\n eeee\n/;s/bbbb/eeee/' file
-
leetking
- 帖子: 62
- 注册时间: 2014-10-28 14:53
- 系统: ubuntu-18.04-LTS
#4
帖子
由 leetking » 2016-12-15 10:57
谢谢大家,我搞定了。
用了类似的方式
当时代码是用于修改openwrt里的network随机生成mac地址并克隆。
我的实现如下
代码: 全选
sed -i "/'wan'/,/^\s*$/{/.*macaddr.*/d}; /'wan'/a\ option macaddr '${mac}'" ${networkrc}
谢谢大家提供的思路。
神奇的是,a命令后面\t转义字符有些不能工作?在ubuntu下能工作,在openwrt里不能工作。好像是的,后来用了直接输入table来解决的。
-
lilydjwg
- 论坛版主
- 帖子: 4248
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
-
联系:
#5
帖子
由 lilydjwg » 2016-12-15 20:08
不同版本的 sed 的行为会不一样。Linux 上一般是 GNU sed,嵌入式系统可能是 busybox 这种简版的。
-
leetking
- 帖子: 62
- 注册时间: 2014-10-28 14:53
- 系统: ubuntu-18.04-LTS
#6
帖子
由 leetking » 2016-12-19 23:05
lilydjwg 写了:不同版本的 sed 的行为会不一样。Linux 上一般是 GNU sed,嵌入式系统可能是 busybox 这种简版的。
嵌入式上确实是busybox,我猜测也是这个原因。但是实在想不出来这点差距会减少多少代码。所以还是有点疑惑