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


12

行のデータに応じてテキストドキュメントの内容を分割するbashスクリプトに取り組んでいます。

元のファイルの内容が次の行に沿っていた場合

01 line
01 line
02 line
02 line

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

01 line
01 line
text to insert
02 line
02 line

私はヒアドキュメントまたは私のスクリプトに似たものを使用してこれを行うことを望んでいます

#!/bin/bash

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

上記はもちろん機能しませんが、このbashスクリプトに実装できる推奨事項はありますか?


回答:


14

ExモードでVimを使用できます:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 行3を選択

  2. i テキストと改行を挿入する

  3. x 変更が行われた場合(書き込みがあった場合)に書き込み、終了する

または、一致する文字列によって:

ex -s -c '/hello/i|world' -c x file.txt

8

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。)


2
置き換えbonux追加echo text to insertcat file-to-insert.txt
Archemar

1
少なくともbashのではなく、すべてのそれらのechoの、あなたが使用することができますprintf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

次のようなものはどうですか:

head -n 2 ./file.txt > newfile.txt
echo "text to insert" >> newfile.txt
tail -n +3 ./file.txt >> newfile.txt
mv newfile.txt file.txt

1
奇妙だが面白いアイデア+1
TyTë-Ø19年

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.