我有一个像这样的字符串:
schedule="0.25"
我想0.25
用0.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"