这是一个非常基本的概念,但有些东西我从来没有能够表达得那么好。我想试着拼写它,看看我哪里错了。
如果我必须这样做,我将如何定义一个“换行符”呢?比如说,如果我在unix中创建一个新文件(或windows),那么文件是否通过在文件中插入一个名为“新行字符”的特殊字符来存储“行尾”信息。如果是这样,它的ascii值是什么?我记得在C程序中,我已经对照值“\n”检查了读取字符。为什么这会混淆2个字符来表示行尾字符...
bash$ cat states
California
Massachusetts
Arizona
比如说,我想在两行之间插入一行空格,并输出如下形式:所需输出:
California
Massachusetts
Arizona
bash$sed -e 's/\n/\n\n/g' states does not work.
为什么我不能像对待任何其他字符一样对待“换行字符”,并运行类似上述命令的命令。(我理解有人可能会说这是sed的语法问题,但请解释一下不允许这样做背后的直觉,这样我就可以摆脱我的困惑。
同样,在vim编辑器中,我不能用途:%s/\n/\n\n/g。为什么?
我是否需要在sed中使用反斜杠并从vim中进一步转义\n?
谢谢你,
亚格拉蒂
8条答案
按热度按时间s2j5cfk01#
新行(\n)为10(0xA),回车(\r)为13(0xD)。
不同的操作系统为文件选择了不同的行尾表示法。Windows使用CRLF(\r\n)。Unix使用LF(\n)。较早的Mac OS版本使用CR(\r),但OS X切换为Unix字符。
下面是一个相对有用的常见问题解答。
rvpgvaaj2#
从
sed
man page:通常,sed循环地将一行输入(不包括其终止换行符)复制到模式空间中(除非在“D”函数之后还有剩余的内容),应用所有带有选择该模式空间的地址的命令,将模式空间复制到标准输出中,添加一个换行符,然后删除该模式空间。
它是在没有换行符的行上运行的,所以你在那里的模式永远不能匹配,你需要做别的事情--比如对
$
(行尾)或^
(行首)进行匹配。下面是一个对我有效的例子:
我在
sed
行中的\
后面键入了一个文本换行符。hjzp0vay3#
转义符取决于解释它们的系统。
\n
被许多编程语言解释为换行符,但对于您提到的其他实用程序来说,这并不一定成立。即使它们确实将\n
视为换行符,可能还有其他一些技术可以让它们按照你想要的方式运行。2你必须查阅它们的文档(或者在这里查看其他答案)。对于DOS/Windows系统,换行符实际上是两个字符:回车符(ASCII 13,AKA
\r
),后跟换行符(ASCII 10)。在Unix系统(包括Mac OSX)上,它只是换行符。在较旧的Mac上,它是一个回车符。lztngnrs4#
q35jwt9p5#
我认为Jeff Attwood的this帖子完美地解决了你的问题。它带你了解了Dos、Mac和Unix上换行符之间的区别,然后解释了CR(回车)和LF(换行)的历史。
osh3o9ms6#
sed
可以进入多行搜索和替换模式,以匹配换行符\n
。为此,
sed
首先必须将整个文件或字符串读入保持缓冲区(“保持空间”),这样它就可以将文件或字符串内容视为“模式空间”中的一行。要替换一个可移植的换行符(相对于GNU和FreeBSD
sed
),您可以使用转义的“真实的”换行符。然而,还有一种更方便得多的方法却达到了同样的结果:
dced5bon7#
试试看:
kgsdhlau8#
我看到了很多sed的答案,但是没有一个是针对vim的。公平地说,vim对换行符的处理有点混乱。搜索\n,但替换为\r。我推荐RTFM:通常为
:help pattern
,特别是:help NL-used-for-Nul
。要使用:substitute命令执行您想要的操作,
虽然我想大多数人会用
效果相同。
这里有一种方法可以自己找到答案。通过xxd运行您的文件,xxd是标准vim发行版的一部分。
你得到
这表明46是C的十六进制代码,61是a的代码,依此类推。特别是,0a(十进制10)是\n的代码。为了好玩,可以尝试
您将看到0d0a(CRLF)作为行终止符。