行のデータに基づいてテキスト文書の内容を分割する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さんのコメントに基づいて作成しました。