Bash 为什么sed要删除我的标题行?

Bash 为什么sed要删除我的标题行?,bash,sed,Bash,Sed,我使用sed将file.txt中每一行的第二个逗号替换为破折号(-): 我得到的是: a,1-2 b,1-2 c,1-2 为什么sed要删除我的标题行 (如果这是一个重复的问题,请道歉。搜索 “sed删除第一行”仅返回“如何删除第一行”的变体 GNU bash,版本4.3.27(1)-发行版(x86_64-apple-darwin13.4.0)使用此选项,无需while循环: sed 's/,/-/2' file.txt > file_new.txt 输出: 这是标题行 a、 1-2

我使用sed将file.txt中每一行的第二个逗号替换为破折号(-):

我得到的是:

a,1-2
b,1-2
c,1-2
为什么sed要删除我的标题行

(如果这是一个重复的问题,请道歉。搜索 “sed删除第一行”仅返回“如何删除第一行”的变体


GNU bash,版本4.3.27(1)-发行版(x86_64-apple-darwin13.4.0)

使用此选项,无需while循环:

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

这是标题行
a、 1-2
b、 1-2
c、 1-2

sed
将自己对文件进行迭代,并将命令应用于每一行。

hek2mgl为您的目标提供了正确的解决方案,但您的问题的答案有点复杂

起初我想说循环应该只得到输出文件中输入文件的最后一行,但后来我测试了它,结果没有

我错过了你也错过的东西

您没有在那里将
$line
交给
sed
。你没有给它任何东西。它是从标准输入读取的

您已经从
file.txt
打开了该while循环的stdin,但sed继承了该循环。因此,read吃掉了第1行,sed将文件中的其余行阻塞,并将它们吐到stdout(输出文件),然后当
read
看到
EOF
时,while循环终止


如果您在该循环中将
$line
输入到
sed
,您将得到我最初认为的行为,这只是文件中的最后一行(因为您使用的是
,而不是
)。

下面的hek2mgl给出的答案是最正确的;这里有一个额外的好处:如果你想从一个流中进来(例如通过
cat
),你可以这样做:
cat file.txt | sed's/,/-/2'>file_new.txt
读取会吃掉第1行,sed会吃掉文件中的其余行
,就是这样+回答得好!杰出的这个答案也有助于解决我一直遇到的一些其他困扰问题。
a,1-2
b,1-2
c,1-2
sed 's/,/-/2' file.txt > file_new.txt