
の次のファイル挿入方法は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
,p
w
q
答え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
これにより、最後の行を除くすべてが表示され、次にcat
がinserted_file.txt
表示され、最後に の最後の行が表示されますfirst_file.txt
。