regex - "sed"特殊字符处理

标签 regex bash shell unix sed

我们的脚本中有一个 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/

相关文章:

regex - 如何在 Google Docs re2 表达式中筛选双引号?

javascript - 在 javascript/nodejs 中搜索并替换所有内容

regex - 如何使用 grep 命令获取连续包含六个或更多辅音的单词的列表?

shell - 到同一台机器的并行远程SSH

bash - Shell 脚本和安全性

javascript - Javascript 中的单词边界匹配

regex - 尝试使用 regexp_matches() 编写一个 SQL 查询,在 postgresql 中看起来是正向的

bash - Bash 中带引号修饰符的引号参数扩展

bash - 对标准输出的每一行添加时间戳

Android shell EOF