给定此字符串:
https://example.com?a=1&b=2
我想要实现以下目标:
https://example.com?a=VALUE&b=VALUE
这是我取得的进展:
echo "https://example.com?a=1&b=2" | sed -e 's!=[^=]*&!=VALUE!'
给出:
https://example.com?a=VALUEb=2
我试图弄清楚为什么“=”和“?”使用起来如此棘手,并让 sed 命令(如果它是最佳选择?)处理尽可能多的奇怪字符作为查询字符串中的值。
答案1
echo "https://example.com?a=1&b=2" | sed -e 's!=[^=]*&!=VALUE!' https://example.com?a=VALUEb=2
您正在消耗“&”符号但并未替换它。
您需要
sed
多次重复替换过程。g
在关闭替换规范后使用尾随(表示全局)。
$ echo 'https://example.com?a=1&b=2' | sed -e 's!=[0-9]*!=VALUE!g'
https://example.com?a=VALUE&b=VALUE
我试图弄清楚为什么“=”和“?”如此难以使用
有些字符既可以充当 shell 元字符,也可以充当正则表达式中的元字符。通常两者都是!它们具有特殊含义,而不是其普通含义。您需要小心处理这些字符,要么避免使用它们,要么将其转义。
使 sed 命令...处理尽可能多的[奇怪的]字符作为查询字符串中的值。
您使用由终止符的否定¹组成的集合的方法很好。您只是在指定终止符时犯了一个错误。您要替换的值的结尾在数据中用与号 ( &
)表示不是通过等号 ( =
)。
$ echo 'https://example.com?a=1&b=2' | sed -e 's!=[^&]*!=VALUE!g'
https://example.com?a=VALUE&b=VALUE
¹即排除或任何适当的集合论术语。