我想插入这个
cat <<EOF >> /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
root soft nproc 65535
root hard nproc 65535
root soft nofile 65535
root hard nofile 65535
EOF
进入文件的倒数第二行,该# End of file
行之前。
我知道我可以使用其他方法来插入此语句而不使用,EOF
但为了视觉效果,我也想保留这种格式以提高可读性。
答案1
要保持相同的此处文档格式并在文件最后一行之前插入给定文本,请尝试 ed!
ed -s /etc/security/limits.conf << EOF
$ i
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
root soft nproc 65535
root hard nproc 65535
root soft nofile 65535
root hard nofile 65535
.
wq
EOF
这会向 ed 发送一系列命令,所有命令都在此处文档中。我们用 来寻址文件中的最后一行,$
并表示我们想要i
插入一些文本。文本如下,就像您的示例一样;一旦我们完成了插入的文本,我们就告诉 ed 我们已经完成了一个句点 ( .
)。 W
将文件写回磁盘,然后q
uit。
如果您想折叠到,$ i
您$i
需要转义美元符号或使用引用的此处文档 ( ed -s input << 'EOF' ...
) 来防止$i
扩展到变量的当前值i
或空(如果没有此类变量集)。
答案2
您可以使用ex
(这是一个模式编辑vi
)来完成此任务。
您可以使用:read
命令将内容插入到文件中。该命令采用文件名,但您可以使用/dev/stdin
伪设备从标准输入读取,这允许您使用<<EOF
标记。
该:read
命令还采用一个范围,您可以使用 符号$-
,该符号可分解为$
,表示文件的最后一行,并-
从中减去 1,即可到达文件的倒数第二行。 (你$-1
也可以使用。)
把它们放在一起:
$ ex -s /etc/security/limits.conf -c '$-r /dev/stdin' -c 'wq' <<EOF
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
root soft nproc 65535
root hard nproc 65535
root soft nofile 65535
root hard nofile 65535
EOF
是-s
为了使其静音(而不是切换到视觉模式,这会使屏幕闪烁。)$-r
是缩写(完整的$-1read
也可以),最后wq
是您在 中编写和退出的方式vi
。 :-)
更新:如果您不想在最后一行之前插入,而是想在具有特定内容的行之前插入(例如“# End of file”),则只需使用模式即可/search/
实现。
例如:
$ ex -s /etc/security/limits.conf -c '/^# End of file/-1r /dev/stdin' -c 'wq' <<EOF
...
EOF
答案3
另一种方法:打印文件除最后一行之外的所有内容,打印新文本,然后打印文件的最后一行。然后将所有输出重定向到一个新文件。
{
sed '$d' limits.conf
cat <<EOF
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
root soft nproc 65535
root hard nproc 65535
root soft nofile 65535
root hard nofile 65535
EOF
tail -1 limits.conf
} > tmpfile && mv tmpfile limits.conf