zsh s扩展带有特殊字符的变量并保留它们

问题描述 投票:0回答:1

我正在尝试将字符串存储在变量中,然后在sed命令中扩展该变量。

我将在调用命令之前放入变量中的几个值将带有括号(左括号前有斜杠,无斜杠,而右括号前无斜杠),换行符和其他特殊字符。另外,该字符串将在正在搜索的文件中用双引号引起来,我想使用那些双引号将其限制为仅查询的字符串。

该命令必须能够与文件中的那些特殊字符匹配。使用zsh / Mac OS,尽管如果该命令与bash 4.2兼容,那将是一个不错的选择。回显xargs也很好。另外,如果awk对此更好,我不需要使用sed。

类似...

sed 's/"\"$(echo -E - ${val})\""/"${key}.localized"/g' "${files}"

考虑到$ val是我上面描述的变量,$ key没有空格(但是带有下划线)&$ files是文件路径的数组(最好与空格兼容,但是不需要)。

$ val的示例输入值...

... "something \(customStringConvertible) here" ...

... "something (notVar) here" ...

... "something %@ here" ...

... "something @ 100% here" ...

... "something for $100.00" ...

示例输出:

... "some_key".localized ...

我正在使用sed命令替换上面的示例。我覆盖它的文本非常简单。

我遇到的关键问题是使命令与特殊字符匹配,而不是先扩展特殊字符然后尝试匹配。

感谢您的协助。

macos awk sed special-characters zsh
1个回答
1
投票

awk更好,因为它提供了使用文字字符串的功能:

$ val='something \(customStringConvertible) here' awk 'index($0,ENVIRON["val"])' file
... "something \(customStringConvertible) here" ...

$ val='something for $100.00' awk 'index($0,ENVIRON["val"])' file
... "something for $100.00" ...

以上已在此输入文件上运行:

$ cat file
... "something \(customStringConvertible) here" ...
... "something (notVar) here" ...
... "something %@ here" ...
... "something @ 100% here" ...
... "something for $100.00" ...

使用sed,您必须按照Is it possible to escape regex metacharacters reliably with sed的说明尝试伪造sed。

尚不清楚您的真正目标是什么,因此,如果需要更多帮助,请编辑问题以提供简洁,可测试的样本输入和预期输出。话虽如此,看来您正在进行替代,所以也许这就是您想要的:

$ old='"something for $100.00"' new='here & there' awk '
    s=index($0,ENVIRON["old"]) { print substr($0,1,s-1) ENVIRON["new"] substr($0,s+length(ENVIRON["old"])) }
' file
... here & there ...

或者,如果您愿意:

awk '
    BEGIN { old=ARGV[1]; new=ARGV[2]; ARGV[1]=ARGV[2]="" }
    s=index($0,old) { print substr($0,1,s-1) new substr($0,s+length(old))   }
' '"something for $100.00"' 'here & there' file
... here & there ...

请参阅How do I use shell variables in an awk script?了解我如何使用上面的ENVIRON []和ARGV []。

© www.soinside.com 2019 - 2024. All rights reserved.