Insert EOF statement before the last line of file

catgnusedtext processing

I want to insert this

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

into the second to last line of the file, before the # End of file line.

I know I could use other methods to insert this statement without the use of EOF but for visual candy I wanted to maintain this format as well for readability.

Best Answer

You can use ex (which is a mode of the vi editor) to accomplish this.

You can use the :read command to insert the contents into the file. That command takes a filename, but you can use the /dev/stdin pseudo-device to read from standard input, which allows you to use a <<EOF marker.

The :read command also takes a range, and you can use the $- symbol, which breaks down into $, which indicates the last line of the file, and - to subtract one from it, getting to the second to last line of the file. (You could use $-1 as well.)

Putting it all together:

$ 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

The -s is to make it silent (not switch into visual mode, which would make the screen blink.) The $-r is abbreviated (a full $-1read would have worked as well) and finally the wq is how you write and quit in vi. :-)


UPDATE: If instead of inserting before the last line, you want to insert before a line with specific contents (such as "# End of file"), then just use a /search/ pattern to do so.

For example:

$ ex -s /etc/security/limits.conf -c '/^# End of file/-1r /dev/stdin' -c 'wq' <<EOF
...
EOF
Related Question