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

zsh sed expanding a variable with special characters and keeping them

我正在尝试将字符串存储在变量中,然后在 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 0.00" ...

示例输出:

... "some_key".localized ...

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

我遇到的关键问题是让命令与特殊字符匹配,而不是展开它们然后尝试匹配。

在此先感谢您的帮助。

awk 更好,因为它提供了处理文字字符串的函数:

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

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

以上是此输入文件的 运行:

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

使用 sed,您必须按照 中的说明来尝试伪造 sed。

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

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

或者如果您愿意:

$ old='"something for 0.00"' new='here & there' awk '
    BEGIN { old=ENVIRON["old"]; new=ENVIRON["new"]; lgth=length(old) }
    s=index([=13=],old) { print substr([=13=],1,s-1) new substr([=13=],s+lgth) }
' file

或:

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

有关我如何使用 ENVIRON[] 与上面的 ARGV[] 的信息,请参阅 How do I use shell variables in an awk script?