【问题标题】:String Replacement using UNIX shell script [duplicate]使用 UNIX shell 脚本替换字符串 [重复]
【发布时间】:2015-05-05 03:57:35
【问题描述】:

我想通过以下方式进行字符串替换:

要求:

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

输入:

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”命令(或任何其他字符串替换命令)?我的要求是,控件必须检查块名称,然后从参考文件中获取变量的相关值。

如果有人能给我一个解决方案,那将是非常有帮助的。

谢谢!

Ra-V.

【问题讨论】:

    标签: unix awk sed


    【解决方案1】:

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

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

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

    将用“bar”替换“foo”的第一个实例,但仅限于第 4 到 6 行。

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

    将仅对匹配模式 'baz' 的行进行替换。

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

    将仅对匹配模式“baz”和模式“qux”的行进行替换。

    有许多方法可以指定您希望在哪些行上执行 sed 命令。阅读文档可能会有所帮助。 (即man sed)。换句话说,RTFM。

    【讨论】:

    • 感谢您的 cmets!我确实按照您的建议使用了 > sed -i '/baz/4,6s/foo/bar/' filename.txt。我的问题是我们正在参数化所有值,这会使它变成这样,> sed -i '' "$baz" '/' "$Line_START" ',' "$Line_END" 's/' "$old_val " '/' "$new_val" '/' filename.txt 这会产生一些语法错误和问题。简而言之,行号和所有字符串值都是动态的,因此作为变量传入。有没有更好的方法呢?请纠正我....
    • sed -e "$START,${END}s/$PATTERN/$REPL/" -e "$S2,${E2}s/$PATT2/$REPL2/"
    【解决方案2】:

    如果这个答案没有帮助,请提前抱歉,但我无法发表评论,所以必须在这里发帖。 您是否尝试过将 grep 与 sed 结合使用?您应该能够执行以下操作:

    grep bbbb filename | sed phrase to replace

    【讨论】:

    • 感谢您的 cmets!我确实使用过,> sed -i '/baz/4,6s/foo/bar/' filename.txt 我的问题是我们正在参数化所有值,这会使它变成这样,> sed -i '' " $baz" '/' "$Line_START" ',' "$Line_END" 's/' "$old_val" '/' "$new_val" '/' filename.txt 这会产生一些语法错误和问题。简而言之,行号和所有字符串值都是动态的,因此作为变量传入。有没有更好的方法呢?请纠正我....
    猜你喜欢
    • 2016-09-03
    • 2016-09-04
    • 2014-11-24
    • 2014-06-11
    • 2014-06-06
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多