2014-10-03 58 views
1

我使用SED用破折號,以取代file.txt的每一行的第二個逗號( - ):爲什麼sed刪除我的標題行?

this,is_the,header_row 
a,1,2 
b,1,2 
c,1,2 

while read line; do 
    sed 's/,/-/2' > file_new.txt 
done < file.txt 

預期輸出:

this,is_the-header_row 
a,1-2 
b,1-2 
c,1-2 

我得到什麼:

a,1-2 
b,1-2 
c,1-2 

爲什麼sed刪除我的標題行?

(道歉,如果這是一個重複的問題。搜索的 變化「的sed刪除第一行」只返回的變化「如何刪除第一行」)

GNU的bash,版本4.3.27(1) -release下(x86_64-蘋果darwin13.4.0)

+0

下面hek2mgl的答案是最正確的;這裏有一個好處:如果你想從流中進入(例如通過'cat'),你可以這樣做:'cat file.txt | sed's /,/ -/2'> file_new.txt' – zamnuts 2014-10-03 19:29:25

回答

2

使用此,而while循環:

sed 's/,/-/2' file.txt > file_new.txt 

輸出:

this,is_the-header_row 
a,1-2 
b,1-2 
c,1-2 

sed將在它自己的文件上迭代並將該命令應用於每一行。

1

hek2mgl對您的目標有正確的解決方案,但您的問題的答案有點複雜。

起初我打算說那個循環只應該讓你輸出文件中的最後一行輸入文件,但後來我測試了它,但它沒有。

原來我錯過了一些你錯過了的東西。

您在那裏沒有給$linesed。你沒有給它任何東西。它從標準輸入讀取。

您已經從file.txt打開stdin,但while循環但sed繼承。所以讀取第1行和sed會從文件中找出剩餘的行,將它們吐出到標準輸出(輸出文件),然後當read看到EOF時,while循環終止。

如果你在這個循環,你會得到我最初以爲的行爲,這是隻有在文件的最後一行餵養$linesed(因爲你正在使用>,而不是>>)。

+1

'讀吃第1行,sed從文件中找出其餘的行'這就是它! +1好的答案! – hek2mgl 2014-10-03 20:08:49

+0

優秀!這個答案也有助於我遇到的其他一些嘮叨問題。 – bggarchow 2014-10-03 21:02:55