繁体   English   中英

bash脚本替换字符串中的值

[英]bash script to replace values in a string

我过去曾使用 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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM