sed、最後の行の前にファイルを挿入

sed、最後の行の前にファイルを挿入

の次のファイル挿入方法はsed、以前は最後の行の前でも機能していましたが、現在は機能していません。これは現在の のバグでしょうかsed?

sed を使用したファイル挿入方法のデモ:

mkdir /tmp/test
printf '%s\n' {1..3} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2

$ cat /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
1
2
3
nine
ten

$ head -9 /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
1
2
3

$ cat /tmp/test/f2 | sed -e "/ten/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
ten
1
2
3

$ sed --version
GNU sed version 4.2.1
... 

つまり、行の前にファイルを挿入する方法は、最後の行を除くすべての場所で機能します。以前は機能していました。これは現在のバグですかsed?

ありがとう

答え1

gnu sedオンになっているので、

'e [COMMAND]'
     This command allows one to pipe input from a shell command into
     pattern space.

最後の$行:

sed '$e cat insert.txt' file

ed(インプレース編集する場合は,pを置き換えます) :w

ed -s file<<IN
- r insert.txt
,p
q
IN

または

ed -s file <<< $'-1 r insert.txt\n,p\nq\n'

edが読み取られると、file現在のアドレスは 最後 の行に設定されます$-(または-1) は、現在のアドレスを 1 行前 (つまり$-1) に設定し、現在の行の後にr読み込みます。は、テキスト バッファーの内容を出力し (前述のように、変更を保存するには に置き換えます)、エディターを終了します。insert.txt,pwq

答え2

あなたのコメントによると、あなたは「しなければならない最後の行と一致する$」なので、 の(最後の行) とi(挿入コマンド)を使用することを検討しますsed。例:

sed '$ i\INSERT BEFORE LAST LINE' number.txt
1
2
3
4
INSERT BEFORE LAST LINE
5

ファイルの最後の行に空行がないことを確認すれば、動作するはずです。ドル記号と の間のスペースとの後のiバックスラッシュ ( \)に注意してくださいi。これにより、最後の行に がなくても、バックスラッシュの後のテキストが最後の行に挿入されます/pattern/

注意: このコマンドは、ファイルではなく、最終行の前に 1 行のテキストのみを追加します。最終行の前にファイルの内容を挿入する場合。

ファイル全体を追加したい場合 ( にある場合は追加しませんsed)、次のようにします。

    head -n-1 first_file.txt && cat inserted_file.txt && tail -n1 first_file.txt 

これにより、最後の行を除くすべてが表示され、次にcatinserted_file.txt表示され、最後に の最後の行が表示されますfirst_file.txt

関連情報