在文件最后一行之前插入 EOF 语句

在文件最后一行之前插入 EOF 语句

我想插入这个

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将文件写回磁盘,然后quit。

如果您想折叠到,$ 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

相关内容