web-dev-qa-db-ja.com

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
... 

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

ありがとう

7
xpt

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を使用(インプレースで編集する場合は、,pwに置き換えます):

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

または

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

edfileを読み取ると、現在のアドレスはla$t行に設定されます。 -(または-1)は、現在のアドレスを1行前(つまり$-1)に設定し、rinsert.txtを現在の行の後に読み取ります。 ,pはテキストバッファの内容を出力し(私が言ったように、変更を保存するにはwに置き換えます)、qはエディタを終了します。

5
don_crissti

あなたのコメントによると、「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の最後の行が表示されます。

6
skamazin