bash脚本替换字符串中的值

时间:2019-01-27 04:12:45

标签: bash shell scripting

我过去曾使用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#=#”,所有其他文本应保持不变。

1 个答案:

答案 0 :(得分:0)

使用纯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通常用于字符串操作,并且与stdin一起很好地工作。例如,一次执行两次替换:

$ 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'