使用ed
put 字符#
到文件第 10 行到第 20 行的开头/etc/passwd
。解决方案如下
ed /etc/passwd <<\END
10,20s/^/#/
%p
Q
END
我的问题是,do<<
在这里和\
之前意味着什么END
以及我们为什么使用它。我们是否必须一直使用它?
答案1
您所展示的内容ed
与编辑脚本一起使用。
编辑脚本(一系列命令)作为此处文档ed
传递。ed
此处文档是一段可能是多行文本重定向进入实用程序的标准输入。这里的文档是第一个和最后一个END
标记之间的内容。\
第一个标记前面的表示END
该文档被引用,这意味着 shell 不会尝试扩展其中的变量等。它也可以写成<<'END'
。在此特定实例中,\
可以删除 ,因为编辑脚本不包含任何可供 shell 扩展的内容。
ed
这是用于更简单的非交互式编辑的常用方法,尽管以这种方式使用ed
时应与其选项一起使用。-s
该命令的效果相当于使用sed
with
sed '10,20/^/#/' /etc/passwd
(该ed
脚本将在文件中进行更改,然后在退出之前在终端中显示该文件没有保存更改,这或多或少是上述sed
脚本逐行执行的操作)。
这是不是不过,这是编辑文件的好方法/etc/passwd
(ed
幸运的是,脚本实际上没有这样做,因为它不保存更改)。为此,应使用vipw
用于修改此文件(如等)的工具或特定命令。useradd
这是因为在许多 Unix 系统上,该文件需要与一个或多个其他文件或数据库同步,并且编辑它也需要更新这些文件(例如vipw
自动更新)。
答案2
这不是ed
,这是你的外壳。
这意味着获取原始输入直到单词END
并将其发送到STDIN
命令的。
例如:
$ cat <<\END
> something
> END
something
产生与以下相同的结果:
$ echo something | cat
something