String 如何使用sed在bash脚本中附加字符串?

String 如何使用sed在bash脚本中附加字符串?,string,bash,macos,sed,append,String,Bash,Macos,Sed,Append,您好,我正在尝试使用bash脚本制作一个脚本来编辑mac上的chrome标志。此脚本用于在chrome上将最大SSL设置为TLS1.3。但是,我对sed有一些问题。 我的命令如下所示: sed -i '.bak' -e 's/{\"browser\".*origin\":\"\"\}/\"browser\":\{\"enabled_labs_experiments\":\[\"ssl-version-max@2\"\],\"last_redirect_origin\":\"\"\}/g' "./

您好,我正在尝试使用bash脚本制作一个脚本来编辑mac上的chrome标志。此脚本用于在chrome上将最大SSL设置为TLS1.3。但是,我对sed有一些问题。 我的命令如下所示:

sed -i '.bak' -e 's/{\"browser\".*origin\":\"\"\}/\"browser\":\{\"enabled_labs_experiments\":\[\"ssl-version-max@2\"\],\"last_redirect_origin\":\"\"\}/g' "./Local State"
目标是附加

“已启用的实验室实验”:[“ssl版本”-max@2“]

对此

{“浏览器”:{“最后一次重定向\原点”:“”}

让它看起来像这样

{“浏览器”:{“已启用的实验室实验”:[“ssl版本”-max@2“],“最后一次重定向原点”:“}

我不知道我的命令有什么问题,但我非常感谢任何帮助我实现这一目标的人,或者只是给我指出正确的方向,都会大有帮助

谢谢

sed -i '.bak' -e 's|\(\"browser\"\):{\(\".*origin\":\"\"\)}|\1:{\"enabled_labs_experiments\":[\"ssl-version-max@2\"],\2}|'

诀窍是使用
\(
\)
,定义两个组,并在替换中使用
\1
\2
来表示这些组。顺便说一句,您的花括号在示例中不匹配…

您只是在它们不属于的地方到处扔反斜杠。不要这样做-了解在regexp和backreferee中哪些字符是元字符启用nce的字符串。您只需要:

$ sed 's/\({"browser":\)\(.*origin":""}\)/\1"enabled_labs_experiments":["ssl-version-max@2"],\2/' file
{"browser":"enabled_labs_experiments":["ssl-version-max@2"],{"last_redirect_origin":""}

如果Bash中有字符串(而不是文件),则可能希望使用Bash中的正则表达式引擎,而不是
sed
以这种方式处理它们

鉴于:

$ s1='"enabled_labs_experiments":["ssl-version-max@2"]'
$ s2='{"browser":{"last_redirect_origin":""}'
您可以通过以下方式在
s2
中的第一个
:{
上拆分:

$ [[ $s2 =~ (^[^:]+:){(.*$) ]] && echo "${BASH_REMATCH[1]}{$s1,${BASH_REMATCH[2]}"
{"browser":{"enabled_labs_experiments":["ssl-version-max@2"],"last_redirect_origin":""}
或者,如果您想要与其他答案相同的正则表达式:

$ [[ $s2 =~ (^{\"browser\":){(\"last_redirect_origin\":\"\"}$) ]] && echo "${BASH_REMATCH[1]}{$s1,${BASH_REMATCH[2]}"
{"browser":{"enabled_labs_experiments":["ssl-version-max@2"],"last_redirect_origin":""}