gpt4 book ai didi

regex - "sed"特殊字符处理

转载 作者:行者123 更新时间:2023-12-02 07:28:33 25 4
gpt4 key购买 nike

我们的脚本中有一个 sed 命令,用变量中的值替换文件内容

例如..

export value="dba01upc\Fusion_test"
sed -i "s%{"sara_ftp_username"}%$value%g" /home_ldap/user1/placeholder/Sara.xml

sed 命令忽略特殊字符,如 '\' 并替换为不带 '\' 的字符串“dba01upcFusion_test”
如果我像 export value='dba01upc\Fusion_test'(用 '\' 用 '' 包围)这样的导出,它会起作用。但不幸的是,我们的客户想用单/双引号导出原始文本 dba01upc\Fusion_test 而他不'不想在文本中添加任何额外的字符。
任何人都可以让我知道如何使 sed 放置带有特殊字符的文本..

替换前:Sara.xml
<?xml version="1.0" encoding="UTF-8"?>
<ser:service-account >
<ser:description/>
<ser:static-account>
<con:username>{sara_ftp_username}</con:username>
</ser:static-account>
</ser:service-account>

替换后:Sara.xml
<?xml version="1.0" encoding="UTF-8"?>
<ser:service-account>
<ser:description/>
<ser:static-account>
<con:username>dba01upcFusion_test</con:username>
</ser:static-account>
</ser:service-account>

提前致谢

最佳答案

你不能用 sed 稳健地解决这个问题。只需使用 awk 代替:

awk -v old="string1" -v new="string2" '
idx = index($0,old) {
$0 = substr($0,1,idx-1) new substr($0,idx+length(old))
}
1' file

啊,@mklement0 有一个很好的观点 - 要停止解释转义,您需要将 arg 列表中的值与文件名一起传入,然后从中分配变量,而不是使用 -v 为变量分配值。 (请参阅我很久以前在 http://cfajohnson.com/shell/cus-faq-2.html#Q24 上为 comp.unix.shell FAQ 写的摘要,但显然已经忘记了!)。

以下将在每一行找到的每个搜索字符串上稳健地进行所需的替换( a\ta -> e\tf ):
$ cat tst.awk
BEGIN {
old=ARGV[1]; delete ARGV[1]
new=ARGV[2]; delete ARGV[2]
lgthOld = length(old)
}
{
head = ""; tail = $0
while ( idx = index(tail,old) ) {
head = head substr(tail,1,idx-1) new
tail = substr(tail,idx+lgthOld)
}
print head tail
}

$ cat file
a\ta a a a\ta

$ awk -f tst.awk 'a\ta' 'e\tf' file
e\tf a a e\tf
file 中的空白是标签。如果您愿意,您可以向下移动 ARGV[3] 并调整 ARGC,但在大多数情况下没有必要。

关于regex - "sed"特殊字符处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com