次の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
...
つまり、lineメソッドの前にファイルを挿入すると、最後の行を除くすべての場所で機能します。以前は機能していました。現在のsed
のバグですか?
ありがとう
gnu sed
を使用しているので、
'e [COMMAND]'
This command allows one to pipe input from a Shell command into
pattern space.
la$
t行:
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
を読み取ると、現在のアドレスはla$
t行に設定されます。 -
(または-1
)は、現在のアドレスを1行前(つまり$-1
)に設定し、r
はinsert.txt
を現在の行の後に読み取ります。 ,p
はテキストバッファの内容を出力し(私が言ったように、変更を保存するにはw
に置き換えます)、q
はエディタを終了します。
あなたのコメントによると、「HAVE TO 最後の行と一致」なので、$
(最後の行)と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
the inserted_file.txt
が表示され、次にfirst_file.txt
の最後の行が表示されます。