繁体   English   中英

使用 sed 替换为带有特殊字符的 var

[英]Using sed to replace to a var with special characters

我想将示例中文件<<string>>上的占位符替换为具有多个特殊字符的 var 的内容。

文件.txt

My string: <<string>>

脚本文件

STRING="something-else;device=name.of.device;key=abcd1234/wtp="
sed -i "s/<<string>>/${STRING}/g" file.txt

我收到此错误:

sed: -e expression #1, char 165: unknown option to `s'

我已经将此sed命令用于其他没有特殊字符的变量。 有什么办法可以完全转义 var ${STRING} 吗?

您无法使用 sed 轻松而稳健地完成这项工作,请参阅是否可以使用 sed 可靠地转义正则表达式元字符 相反,只需使用像 awk 这样理解文字字符串的工具:

$ string='~`!@#$%^&*()-_+={[}]|\:;"'\''<,>.?/\1'

$ echo "$string"
~`!@#$%^&*()-_+={[}]|\:;"'<,>.?/\1

$ string="$string" awk -i inplace 'match($0,/(.*)(<<string>>)(.*)/,a){ $0=a[1] ENVIRON["string"] a[3] } 1' file.txt

$ cat file.txt
My string: ~`!@#$%^&*()-_+={[}]|\:;"'<,>.?/\1

上面的内容适用于string可能包含的任何字符(或反向引用子字符串,如\\1 ),因为它只是使用文字字符串操作(连接)进行替换。

它使用 GNU awk for -i inplace就像你的原始脚本使用 GNU sed for -i

顺便说一下,不要对非导出变量名称使用全部大写,以避免与导出和内置变量发生冲突,并且不要通过使代码看起来像是在使用导出变量来混淆代码,请参阅更正 Bash 和 shell 脚本变量大写

请注意,如果您有多个<<whatever>>占位符,您可以轻松地参数化上述内容,例如:

$ foo='Now is the Winter'
$ bar='Of our discontent'

$ cat file.txt
My foo string: <<foo>>
My bar string: <<bar>>

$ foo="$foo" bar="$bar" awk -i inplace 'match($0,/(.*)<<(\w+)>>(.*)/,a) && (a[2] in ENVIRON){ $0=a[1] ENVIRON[a[2]] a[3] } 1' file.txt

$ cat file.txt
My foo string: Now is the Winter
My bar string: Of our discontent

如果您不想在 awk 命令行上设置foobar ,您可以在它之前导出它们,或者从配置文件或 here-doc 或 ... - 很多选项中读取它们。

由于STRING包含/ ,您应该使用其他分隔符,例如,您可以像这样使用^

sed  's^<<string>>^'"$STRING"'^g' file.txt

引用逻辑( ''""''在这个 SO answer 上得到了很好的解释。


我的语言环境机器上的示例:

$
$ cat file.txt
My string: <<string>>
$
$
$ STRING="something-else;device=name.of.device;key=abcd1234/wtp="
$
$
$ sed -i 's^<<string>>^'"$STRING"'^g' file.txt
$
$ cat file.txt
My string: something-else;device=name.of.device;key=abcd1234/wtp=
$
$

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM