我正在使用sed用短划线( - )替换file.txt的每一行上的第二个逗号:
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-apple-darwin13.4.0)
答案 0 :(得分: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 :(得分:1)
hek2mgl有正确的解决方案,但问题的答案有点复杂。
起初我打算说那个循环应该只能输出输出文件中输入文件的最后一行,但后来我测试了它,但它没有。
原来我错过了你错过的东西。
您没有将$line
提供给sed
。你没有给它任何东西。它是从标准输入读取的。
你已经为那个while循环打开了file.txt
的标准输入,但是sed继承了它。所以读取第1行和sed snarfs从文件中的其余行,将它们吐出到stdout(转到输出文件),然后当read
看到EOF
时,你的while循环终止。
如果您在该循环中向$line
提供sed
,您将获得我最初认为的行为,这只是文件中的最后一行(因为您使用>
而不是>>
)。