sed 在一个命令中选择行并替换字符串

时间:2021-04-14 13:07:31

标签: sed

我想打印第 49 行并用“,”代替制表符(最好使用 sed)。

sed -n '49p' file.txt | sed 's/,/\t/g'

如何在没有管道的情况下在一个命令中完成?

sed -n '49p; s/,/\t/g' 不起作用,sed '49p; s/,/\t/g' 也不起作用。

谢谢!

4 个答案:

答案 0 :(得分:2)

49 是地址,ps// 是命令。您可以用地址作为任何命令的前缀。因此,不要在行 p 上仅使用 49,而是首先使用 s///

sed -n '49s/,/\t/gp' file

请注意,在这种情况下,p 只是 s/// 的标志,而不是实际的 p 命令。对于任意命令的更一般情况,您可以重复每个命令的地址 49s/,/\t/g; 49p 或将命令分组到一个地址 49 { s/,/\t/g; p } 后面。

正如 comments 中所指出的,您可以通过在第 49 行之后退出 sed 来加速命令,以便不再处理文件的其余部分(类似于 head -n 49 | sed ):

sed -n '49 { s/,/\t/gp; q }' file

答案 1 :(得分:1)

您可以删除除第 49 行以外的任何行,这会忽略除第 49 行之外的其余 sed 命令:

sed '49!d;s/,/\t/g' file.txt

答案 2 :(得分:1)

如果你想用awk来做,你可以用

awk 'NR==49{gsub(/,/,"\t");print;exit}' file

NR==49 将检查第 49 行是否正在处理,如果是,gsub(/,/,"\t") 将用该行中的制表符替换每个逗号,print 将显示它和 { {1}} 将阻止 awk 处理更多行。

答案 3 :(得分:0)

这可能对你有用(GNU sed):

sed '49!d;y/,/\t/;q' file

如果不是第 49 行,则删除。

如果是第 49 行,将逗号转换为制表符并退出。

相关问题