|
Size: 1245
Comment:
|
Size: 1777
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 28: | Line 28: |
=== Insert a Line into a File === Shell scripts make it trivial to append to a file. There are excellent tools such as [[Sed|sed(1)]] for search/replacing text. But there isn't a trivial way to, for example, insert a new line of text into the Nth line of a file. This script demonstrates how such a task could be automated in part. {{{ # Inserts a new third line into the file, # which sets `someYamlProperty` to `true` in a Markdown header of some file. ed "$1" <<EOF 3i someYamlProperty: true . w EOF }}} |
Ed
ed(1) is a non-visual text editor. It is a powerful tool for scripting in-place file manipulation.
Most system also offer ex(1), which is the extended editor.
Input Mode
ed(1) enters input mode after one the following commands has been given:
append (a)
change (c)
insert (i)
Exit input mode by giving a period (.) alone.
Examples
Insert a Line into a File
Shell scripts make it trivial to append to a file. There are excellent tools such as sed(1) for search/replacing text. But there isn't a trivial way to, for example, insert a new line of text into the Nth line of a file.
This script demonstrates how such a task could be automated in part.
# Inserts a new third line into the file, # which sets `someYamlProperty` to `true` in a Markdown header of some file. ed "$1" <<EOF 3i someYamlProperty: true . w EOF
Line Editing
This script will rewrite itself to echo a new message.
message=
#This function uses a heredoc to pass commands into `ed`.
#It works like this:
# - `1c` targets the first line for changing. Everything entered in input mode will replace this line.
# - `message="$1"` is being inserted. Note that shell variables are evaluated in a heredoc.
# - `.` exits input mode
# - `w` writes the edited file to disk
edScript() {
ed -s "$(realpath -s $0)" <<EOF
1c
message="$1"
.
w
EOF
}
#If this script is given an arguments, the first argument is passed to the above function.
#Otherwise, the script just echoes "$message".
if [ $# -ge 1 ]; then
edScript "$1"
else
echo "$message"
fi