2014-10-03 56 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