我过去曾使用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#=#”,所有其他文本应保持不变。
答案 0 :(得分:0)
让我们以您的字符串开头:
$ 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
通常用于字符串操作,并且与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'