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?。
我正在尝试将字符串存储在变量中,然后在 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,您必须按照
不清楚您的真正目标是什么,因此如果您需要更多帮助,请编辑您的问题以提供简明、可测试的样本输入和预期输出。话虽如此,看起来你正在做一个替代,所以也许这就是你想要的:
$ 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?。