替换 URL 字符串中所有出现的“=”和“?”之间的文本

替换 URL 字符串中所有出现的“=”和“?”之间的文本

给定此字符串:

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

¹即排除或任何适当的集合论术语。

相关内容