如何用制表符替换换行符?

21

我有以下的模式

hi
hello
hallo
greetings
salutations
no more hello for you

我试图使用以下命令将所有换行符替换为制表符

sed -e "s_/\n_/\t_g"

但它并没有起作用。

请问有人能帮忙吗?我正在寻找sed/awk的解决方案。

6个回答

51

我认为这里使用tr更好:

tr "\n" "\t" < newlines 

正如Nifle在评论中建议的那样,newlines在这里是包含原始文本的文件名。

由于sed非常以行为导向,在这种情况下使用它更加复杂。


1
@Nifle:这里也没有“cat”,但谁在计算呢? :) - Telemachus
@Tele 我承认我是一个猫奴。 - Nifle
在sed本身中有没有一种方法可以做到这一点? - Vijay
-1,我已经知道我们可以使用tr来完成,但我需要知道如何在sed中完成。 - Vijay
4
@John:也许有人能告诉你如何在 sed 中完成,但考虑到 sed 与行有关,这有点像用锤子敲螺丝钉。 - Telemachus

13

不确定您想要的输出内容

# awk -vRS="\n" -vORS="\t" '1' file
hi      hello   hallo   greetings       salutations     no more hello for you 

11
sed '$!{:a;N;s/\n/\t/;ta}' file

4
可以,请问您需要关于您正在使用的命令的解释吗? - Vijay
如果不是最后一行,则获取下一行并连接到模式空间,替换换行符,然后跳转到标签 :a 并对每一行执行相同操作。 - ghostdog74
+1!这对我有用,即使文件只有一行然后是一个新的空行。大多数其他解决方案让我感到负面惊讶。我不喜欢这样的惊喜。 - Stephen Muga
不起作用在 csh 中。 - CervEd

6

你不能使用sed按行替换换行符。你必须累积行,并替换它们之间的换行符。

text abc\n    <- can't replace this one

text abc\ntext def\n    <- you can replace the one after "abc" but not the one at the end

这个 sed 脚本会累加所有行,并消除除最后一行以外的所有换行符:
sed -n '1{x;d};${H;x;s/\n/\t/g;p};{H}'

顺便提一下,你的sed脚本sed -e "s_/\n_/\t_g"的意思是“用制表符代替所有斜杠和换行符”。下划线在s命令中扮演着定界符的角色,以便更轻松地使用斜杠进行搜索和替换。

6
paste -s

-s 将命令行中指定的所有输入文件的每一行连接起来。除了每个输入文件中的最后一行之外,每行的换行符都将被制表符替换,除非使用 -d 选项另有规定。

-2

你的sed脚本已经接近完成了,你只需要将它改为:

sed -e "s/\n/\t/g"

\已经足够进行转义,不需要添加_。同时,在结尾处需要添加/来告诉sed这是脚本的最后一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接