将值替换为双引号之间的可变长度

将值替换为双引号之间的可变长度

我有一个像这样的字符串:

schedule="0.25"

我想0.250.50

我可以通过以下方式实现这一目标:

sed 's/\"....\"/\"0\.50\"/g'

问题是我不知道双引号之间的值,因此我不知道长度。它可以是任何值,但前面总是带有schedule=

答案1

您可以用来[^"]*匹配零个或多个非字符的序列"。所以

$ echo 'schedule="0.25"' | sed 's/"[^"]*"/"0.5"/'
schedule="0.5"

答案2

看起来您只想将等号后面的内容替换为"0.50"。这很容易通过以下方式完成awk

$ echo 'schedule="0.25"' | awk -F = 'BEGIN { OFS=FS } $1 == "schedule" { $2 = "\"0.50\"" } { print }'
schedule="0.50"

该程序专门查找第一个分隔字段awk为 的记录。找到后,它将用 替换第二个字段。=schedule"0.50"

如果0.50是变量,您可以将此值传递到awk脚本中,如下所示:

$ newval=0.222
$ echo 'schedule="0.25"' | awk -v nv="$newval" -F = 'BEGIN { OFS=FS } $1 == "schedule" { $2 = sprintf("\"%s\"", nv) } { print }'
schedule="0.222"

显然,如果schedule也可能有所不同,

$ newval=0.222
$ variable=schedule
$ echo 'schedule="0.25"' | awk -v v="$variable" -v nv="$newval" -F = 'BEGIN { OFS=FS } $1 == v { $2 = sprintf("\"%s\"", nv) } { print }'
schedule="0.222"

使用sed,您可以忽略后面的任何内容=并将其替换为您想要的任何内容:

$ echo 'schedule="0.25"' | sed 's/=.*/="0.50"/'
schedule="0.50"

为了确保我们仅替换 的值schedule,而不替换其他设置的值,

$ echo 'schedule="0.25"' | sed '/^schedule=/s/=.*/="0.50"/'
schedule="0.50"

这给我们的替换设置了一个条件;schedule=该行的开头必须有该字符串才能触发。

我们甚至可以将 shell 变量插入sed表达式中,但请注意,我们必须确保这些变量的值不会破坏语法sed(通过包含影响命令匹配或定界的字符):

$ newval=0.222
$ variable=schedule
$ echo 'schedule="0.25"' | sed "/^$variable=/s/=.*/=\"$newval\"/"
schedule="0.222"

awk示例相反,这里我们依靠 shell 将变量的值注入到sed编辑脚本中。在变量值不受我们控制的情况下(例如当我们从用户提供的源中读取它们时),这通常被归类为代码注入漏洞。

答案3

如果您从 bash 脚本/终端调用 sed/awk,那么您可以避免使用外部工具并利用 bash 自己的字符串处理功能:

$ a='schedule="0.25"'
$ echo "$a"
schedule="0.25"
$ b="${a/\"*/\"0.50\"}"
$ echo "$b"
schedule="0.50"

相关内容