2016-03-01 62 views
0

我想刪除文件(file.a)中所有以##開頭的行,並將其替換爲另一個文件(file.b)的所有行。要從file.a中刪除的行首先出現在該文件中(前面沒有行)。sed輸出的貓

長的方法是:

sed -i '/##/d' file.a 
cat file.b file.a > file.c 
mv file.c file.a 

是否有短(排隊)的方式?

+0

如果'file.a'有2行以'##'開始,'file.b'有總共10行,那麼您希望從'file'中刪除2行.a'並將'file.b'的所有'10'行附加到'file.a'? – Utsav

+0

以某種方式。你可以說我想從file.a中刪除所有n個第一行(以「##」開頭)並將file.b添加到file.a.我不知道n是aprior,儘管grep「##」file.a | wc -l會解決這個問題。 – user1701545

回答

1

例如文件file.a

## line 
## line 
## line 
linea1 
linea2 
linea3 

file.b

lineb1 
lineb2 
lineb3 

這應該做到這一點:

$ sed -e '1r file.b' -e'/^##/d' file.a 
lineb1 
lineb2 
lineb3 
linea1 
linea2 
linea3 

r filename命令插入在第1行的文件,並且所述第二命令刪除以##開頭的所有行。他們必須在不同的-e表情,因爲在文件名後必須有一個新行或命令的結束,所以這會工作,以及:

sed '1r file.b 
/^##/d' file.a 

對於file.a就地改造,該命令變爲

sed -i -e '1r file.b' -e'/^##/d' file.a 

注意,命令的順序是顯著:刪除命令(d)開始一個新的循環,而這被跳過後到來的任何命令,所以r先走。 Hat-tip:potong

+0

N.B.執行'd'命令後的任何命令都不會被執行,因爲它會刪除模式空間並開始[新週期](http://www.gnu.org/software/sed/manual/sed.html#Common-Commands) 。因此,命令必須按照上述順序,而不是相反。 – potong

+0

@potong我會繼續說,我知道這一點;)讓我明確指出。 –