sed s/project/project_name/ sed.txt
在输出中可以看到,project 的第一个实例被更改为 project_name:
system "echo 'project_name:$project' >> logfile";
system "echo 'version:$version' >> logfile";
system "echo 'optionalid:$optionalid' >> logfile";
system "echo 'nodes:$nodes' >> logfile";
system "echo 'threads:$threads' >> logfile";
然而,第二个实例未更改,尽管它肯定匹配您的正则表达式。您从第一个示例中知道,sed 似乎更改其输入中的每个匹配字符串,而不是仅更改第一个匹配字符串,因为它更改 logfile 的每个实例。
区别在于,logfile 的每个实例在单独的行上,而同一行上却有两个 project 实例。这为什么非常重要?因为 sed 被实现为一个行编辑器。它一次将一个单独的行放到内存中,并将其作为单个单元来操作。在运行 sed 时务必记住这点,因为所有命令行选项都是按这个设计原则来设计的(从而使大多数 sed 实现不会受到与系统内存有关的文件大小限制)。缺省情况下,每一行都视为 sed 命令的一次新的执行。尽管在第一个示例中似乎不是这样,但是其中 sed 命令仅替换匹配字符串的第一个实例。然而,您可以简单地使用一个 g 标志来改变此行为。
g 标志
执行同样的 sed 命令,但这次在结尾附加一个 g:
sed s/project/project_name/g sed.txt
这次,第一行上的两个 project 实例都被更改为 project_name:
system "echo 'project_name:$project_name' >> logfile";
system "echo 'version:$version' >> logfile";
system "echo 'optionalid:$optionalid' >> logfile";
system "echo 'nodes:$nodes' >> logfile";
system "echo 'threads:$threads' >> logfile";
标签: