【问题标题】:bash script to replace values in a stringbash脚本替换字符串中的值
【发布时间】:2019-01-27 12:25:13
【问题描述】:

我过去曾使用 awk 和 grep 使用 bash 脚本提取子字符串,但我不知道如何找到子字符串,然后使用 bash 脚本替换该子字符串中的部分值。

如果我有如下字符串:

"key val1=0 val2=15 val3=22 'some notes here'"

如何有效地将 val1、val2 和 val3 值更新为其他值?所以如果我想把“val1=0”改成“val1=9999”,把“val2=22”改成“val2=0”。

我可以根据空格拆分字符串,遍历值以找到 val1,将其拆分为 0,将 0 更改为 9999(对 val2 重复),但是如何使用原始值重新创建原始字符串所以我结束了:

"key val1=9999 val2=0 val3=22 'some notes here'"

我有一个要求,这是在我不太熟悉的 bash 脚本中完成的,因此不幸的是,将其切换到 python、perl 或其他语言对我来说不是一个选择。

如果有区别,字符串将通过 STDIN 传递给脚本。我有兴趣更改的字符串的唯一部分是“val#=#”,所有其他文本都应该保持不变。

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    使用纯 bash

    让我们从你的字符串开始:

    $ s="key val1=0 val2=15 val3=22 'some notes here'"
    

    现在,让我们替换为val1

    $ s="${s/val1=0/val1=9999}"
    $ echo "$s"
    key val1=9999 val2=15 val3=22 'some notes here'
    

    构造${var/old/new} 称为模式替换old 的值可以是简单字符串,也可以是shell glob。

    使用 bash 和 sed

    在 bash 脚本中,sed 经常用于字符串操作,它与标准输入配合得很好。例如,一次执行两个替换:

    $ input="key val1=0 val2=15 val3=22 'some notes here'"
    $ echo "$input" | sed 's/val1=[^ ]*/val1=9999/; s/val2=[^ ]*/val2=0/'
    key val1=9999 val2=0 val3=22 'some notes here'
    

    当然,sed 的输出可以使用 命令替换在 shell 变量中捕获:

    $ new="$(echo "$input" | sed 's/val1=[^ ]*/val1=9999/; s/val2=[^ ]*/val2=0/')"
    $ echo "$new"
    key val1=9999 val2=0 val3=22 'some notes here'
    

    【讨论】:

    • 谢谢!我想我想多了这个问题。效果很好
    猜你喜欢
    • 2022-07-21
    • 2015-01-16
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2017-09-06
    • 2021-03-07
    • 2016-01-23
    相关资源
    最近更新 更多