使用UNIX shell脚本替换字符串

时间:2015-03-04 08:31:04

标签: unix awk sed

我想以下列方式更换字符串:

  

要求:

必须根据参考文件中的值更改输出。

输入:

aaaa
val1=xxx
val2=yyy
val3=zzz
bbbb
val1=ppp
val2=qqq
val3=rrr
aaaa
val1=xxx
val2=yyy
val3=zzz

参考文件:

block   variable    value
aaaa    val1        iii
aaaa    val2        jjj
aaaa    val3        kkk
bbbb    val1        eee
bbbb    val2        fff
bbbb    val3        ggg

输出:

aaaa
val1=iii
val2=jjj
val3=kkk

bbbb
val1=eee
val2=fff
val3=ggg

aaaa
val1=iii
val2=jjj
val3=kkk
  

当前方法:

目前我尝试使用Sed命令执行此操作。使用我能够替换1块代码,即

aaaa
val1=xxx
val2=yyy
val3=zzz

成,

aaaa
val1=iii
val2=jjj
val3=kkk

val1,val2,val3变量出现在块'aaaa'和'bbbb'中。但是对于块'aaaa',值将是不同的,对于块'bbbb',值将是不同的。 目前正在使用'sed'命令我可以替换块'aaaa'的值,但对于'bbbb'块,也会采用相同的值。

  

查询:

如何单独为一组特定行执行'sed'命令(或任何其他字符串替换命令)?我的要求是,控件必须检查块名称,然后从参考文件中获取变量的相关值。

如果有人能给我一个解决方案,那将会很有帮助。

  

谢谢!

     

太阳神-V

2 个答案:

答案 0 :(得分:0)

如果此答案无效,请提前抱歉,但我无法发表评论,因此必须在此处发布。 您是否尝试过将grep与sed结合使用?你应该可以这样做:

grep bbbb filename | sed phrase to replace

答案 1 :(得分:0)

你的问题应该被编辑。除了“如何为一组特定的行单独执行'sed'命令(或任何其他字符串替换命令)之外,我忽略了所有这些内容?”这似乎是问题的核心。

sed接受地址。要按行号指定特定行:

sed -e '4,6s/foo/bar/'

会将'foo'的第一个实例替换为'bar',但仅限于第4到第6行。

sed -e '/baz/s/foo/bar/'

只会在符合'baz'模式的行上进行替换。

sed -e '/baz/{/qux/s/foo/bar/; }'

只能在匹配模式'baz'模式'qux'的行上进行替换。

有许多方法可以指定要执行sed命令的行。阅读文档可能会有所帮助。 (即man sed)。换句话说,RTFM。