特定の行番号にテキストを挿入する

特定の行番号にテキストを挿入する

行のデータに基づいてテキスト文書の内容を分割するbashスクリプトを作成しています。

元のファイルの内容が次のような場合

01 line
01 line
02 line
02 line

bashを使用してこのファイルの3行目を挿入して生成するにはどうすればよいですか?

01 line
01 line
text to insert
02 line
02 line

私はheredocなどを使って私のスクリプトでこれを行いたいと思います。

#!/bin/bash

vim -e -s ./file.txt <<- HEREDOC
    :3 | startinsert | "text to insert\n"
    :update
    :quit
HEREDOC

上記の方法は間違いなく動作しません。しかし、このbashスクリプトに実装できる提案はありますか?

答え1

ex行番号を使用してPOSIXツールを使用できます。

ex a.txt <<eof
3 insert
Sunday
.
xit
eof

または文字列の一致:

ex a.txt <<eof
/Monday/ insert
Sunday
.
xit
eof

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html

答え2

sed伝統的な選択肢になります(GNU sedはこれよりも単純な形式を持つことができます)。

$ cat input
01 line
01 line
02 line
02 line
$ sed '2a\
text to insert
' < input
01 line
01 line
text to insert
02 line
02 line
$ 

または非常に伝統的ですed(ボーナス!内部編集、移植不可能なsed -iフォームなし)。

$ (echo 2; echo a; echo text to insert; echo .; echo wq) | ed input
32
01 line
47
$ cat input
01 line
01 line
text to insert
02 line
02 line
$ 

(これとは何の関係もありませんbash。)

答え3

$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line

答え4

以下を試してください。

あなたのオリジナルファイル

$ cat <<'EOF' > file.txt
01 line
01 line
02 line
02 line
EOF

区切り文字を使用して3行に挿入します。

$ cat <<'EOF' | sed -i "3r /dev/stdin" file.txt
text to insert
EOF

あなたはこの結果を得ます

$ cat file.txt
01 line
01 line
text to insert
02 line
02 line

修正する:@Kusalanandaさんのコメントに基づいて作成しました。

関連情報