sed s/$project/$project_name/ sed.txt
您可以在输出中看到 $project 被更改了,但是 project 没有被更改 。
system "echo 'project:$project_name' >> logfile";
system "echo 'version:$version' >> logfile";
system "echo 'optionalid:$optionalid' >> logfile";
system "echo 'nodes:$nodes' >> logfile";
system "echo 'threads:$threads' >> logfile";
更改某个项的多个实例
这引入了 sed 中的另一个重要功能 。如果您希望同时更改 project 的两个实例,该怎么办呢?通过到目前为止已学到的知识,合理的回答是只需使用 project 作为正则表达式,但是此回答并不是非常正确 。下面将继续并进行尝试,以便能够演示和解释该过程:
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";
推荐阅读
- UNIX 新手指南,第 2 部分: vi 文本编辑器
- UNIX 新手指南: 一些很好的 Shell 诀窍
- 使用 UNIX System V IPC 机制共享应用程序数据
- iphone11id设置
- 和大6小3的第一次接触
- 利用 UNIX 脚本来管理 DS4000 磁盘阵列系统
- 对话 UNIX,第 13 部分: 另外十种命令行组合
- UNIX 生产力技巧
- UNIX 新手指南,第 1 部分: 文件维护工具
- 使用 UNIX find 命令的高级技术