2

首先,如果之前已经回答过这个问题,但我无法解决我的问题,我深表歉意。

我需要搜索一个模式,然后用一行包含文本和变量的文本替换它。顺便说一句,我正在使用 bash..

$var = "stacko.ver/rulz=" **Note: $var contain double quotes & = & a dot and /**

我想遵循 1.Search for;te.xt = 注意:要搜索的值包含;& = 和一个点

2.替换为

textnum=$var

当然 $var 应该替换为它的实际值

我的尝试

sed -i "s/;te.xt =/textnum=$var/" file
sed -i "s/;te.xt =/textnum="$var"/" file
sed -i "s/";te.xt ="/"textnum=$var"/" file

这些都没有真正起作用,要么是 sed 给我一个错误,要么是 $var 的值没有显示在文件中

谢谢您的帮助

问候

4

2 回答 2

5

引用没有帮助,因为这是一个 sed 问题,而不是 bash 问题。只需选择一个未出现在文本中的 sed s-expression 分隔符:

sed -i "s|;te.xt =|textnum=$var|" file

您可以选择s输入中未出现的任何分隔符。sed -e 'streetlight'是一个完全有效的 sed 命令。

于 2013-08-07T16:52:18.070 回答
2

我可以看到错误:

$ var="stacko.ver/rulz="
$ data="foo ;te.xt = bar"
$ sed "s/;te.xt =/textnum=$var/" <<< "$data"
sed: -e expression #1, char 31: unknown option to `s'

问题是它$var包含一个斜杠,所以 sed 的s///命令被破坏了。你需要选择一个没有出现在 $var 中的字符

$ sed "s#;te.xt =#textnum=$var#" <<< "$data"
foo textnum=stacko.ver/rulz= bar

这可能很难——如果斜线和散列在 $var 中怎么办?使用 bash,您可以使用ANSI-C 引用来使用不太可能出现在数据中的控制字符,例如

$ sed $'s\037;te.xt =\037textnum=$var\037' <<< "$data"
foo textnum=stacko.ver/rulz= bar
于 2013-08-07T16:53:20.520 回答