我想用第 n 个素数替换文本文件中的数字,我有一个可执行文件计算第 n 个素数,如何使用该命令sed
将前面的每个数字替换##
为其nthprime
./nthprime 46
199
sed -e 's/46##/199#/g'
文本文件包括如下内容:
(3505948*51##+331)/56439692311
(2608338*52##+401)/2357853732775
(47723079*50##+773)/7419068507
(67##/16##-1)/40446657668663868225798856758
期望输出:
(3505948*233#+331)/56439692311
(2608338*239#+401)/2357853732775
(47723079*229#+773)/7419068507
(331#/53#-1)/40446657668663868225798856758
使用perl 模块的功能
perl
(在Debian 和衍生产品包中),可以避免每次出现以下情况时都必须 fork 一个进程并调用外部实用程序:nth_prime
Math::Prime::Util
libmath-prime-util-perl
n##
如果您确实想调用自己的
nthprime
实用程序:或者将结果缓存作为一种优化,以避免对同一个素数运行多次命令:
标准
sed
无法运行命令。GNU sed 使用其e
命令和e
命令标志作为非标准扩展s
,但这些都是安全噩梦,而且效率更低,因为它们每次除了命令¹之外还运行 shell,所以在我看来最好避免。使用标准实用程序的一种方法是生成
sh
如下代码:提供给
sh
,这几乎不可能既安全(避免命令注入漏洞)又可移植。我能提供的最好的建议是:sed
对于可以处理非文本的GNU 来说,这应该是安全的。在具有不同sed
实现的系统上,您可以通过删除 NUL 字节和折叠长度超过 LINE_MAX 的行来确保输入是有效文本,从而使其更安全(并且仍然确保我们在C
语言环境中工作,而不是在字符编码/解码可能会进一步复杂化的用户环境中工作),例如:(未经测试)
¹ 除了在某些系统上,例如 Solaris,当命令足够简单时,(由 GNU的命令/标志
popen()
使用)可以优化 shell 调用,就像 perl 对其运算符所做的那样。sed
e
`cmd`