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

Eli*_*Eli 4 sed gnu text-processing cat

我想插入这个

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
Run Code Online (Sandbox Code Playgroud)

进入文件的倒数第二行,在该# End of file行之前。

我知道我可以使用其他方法来插入这个语句而不使用EOF但对于视觉糖果我想保持这种格式以及可读性。

Jef*_*ler 7

要保持相同的 here-document 格式并在文件的最后一行之前插入给定的文本,请尝试 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
Run Code Online (Sandbox Code Playgroud)

这会向 ed 发送一系列命令,所有这些都在此处的文档中。我们处理文件中的最后一行$并说我们想要i插入一些文本。文本如下,就像在你的例子中一样;一旦我们完成了插入的文本,我们就告诉 ed 我们已经完成了一个句点 ( .)。 W将文件写回磁盘,然后quit。

如果你想折叠$ i$i你想逃离美元符号或使用带引号的here文档(ed -s input << 'EOF' ...),以防止$i从扩大到目前谷i变量或空,如果没有这样的变量集。


fil*_*den 5

您可以使用ex(这是一个模式的的vi编辑器)来实现这一点。

您可以使用该:read命令将内容插入到文件中。该命令采用文件名,但您可以使用/dev/stdin伪设备从标准输入读取,这允许您使用<<EOF标记。

:read命令还需要一个范围,您可以使用$-符号,该符号分解为$,表示文件的最后一行,并-从中减去一个,到达文件的倒数第二行。(你也可以使用$-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
Run Code Online (Sandbox Code Playgroud)

-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
Run Code Online (Sandbox Code Playgroud)