
以下插入文件方法曾經sed
有效,甚至在最後一行之前也有效,但現在不再有效。這是目前的錯誤嗎sed
?
用sed插入檔案方法demo:
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.
在 la $
t 線上:
sed '$e cat insert.txt' file
With 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
)並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/
最後一行則不需要 a 。
注意:此命令只會在最後一行之前添加一行文本,而不是文件。如果要在最後一行之前插入文件的內容。
如果你想添加整個文件(如果它在 中則不需要sed
)我會使用這個:
head -n-1 first_file.txt && cat inserted_file.txt && tail -n1 first_file.txt
這應該會顯示除最後一行之外的所有內容,然後顯示 的最後cat
一行。inserted_file.txt
first_file.txt