什么是换行符 - '\ n'

时间:2010-07-16 17:13:26

标签: c unix vim sed newline

这是一个非常基本的概念,但我从来没有能够清楚地表达出来。我想拼写它,看看我哪里出错了。

如果必须,我该如何定义“换行符”。如果我在unix(或windows)中创建一个新文件,那么该文件通过在名为“new line character”的文件中插入一个特殊字符来存储“行尾”信息。如果是这样,它的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中使用反斜杠进一步逃避?

谢谢,

Jagrati

8 个答案:

答案 0 :(得分:11)

NewLine(\ n)为10(0xA),CarriageReturn(\ r)为13(0xD)。

不同的操作系统为文件选择了不同的行尾表示。 Windows使用CRLF(\ r \ n)。 Unix使用LF(\ n)。较旧的Mac OS版本使用CR(\ r \ n),但OS X切换到Unix角色。

这是一个相对有用的FAQ

答案 1 :(得分:11)

来自sed man page

  

通常,sed将一行输入(不包括其终止换行符)循环复制到一个模式空间中(除非在“D”函数之后还有一些东西),将所有命令应用于选择该模式的地址space,将模式空间复制到标准输出,附加换行符,并删除模式空间。

它在没有换行符的情况下操作,因此你在那里的模式永远不会匹配。您需要执行其他操作 - 例如与$(行尾)或^(行首)匹配。

这是一个对我有用的例子:

$ cat > states
California
Massachusetts
Arizona
$ sed -e 's/$/\
> /' states
California

Massachusetts

Arizona

我在\行的sed后面输入了一个文字换行符。

答案 2 :(得分:5)

转义字符取决于解释它们的系统。许多编程语言将\n解释为换行符,但对于您提到的其他实用程序,这并不一定适用。即使他们将\n视为换行符,也可能会有其他一些技巧让他们按照您的意愿行事。您必须查阅他们的文档(或在此处查看其他答案)。

对于DOS / Windows系统,换行符实际上是两个字符:回车符(ASCII 13,AKA \r),后跟换行符(ASCII 10)。在Unix系统(包括Mac OSX)上,它只是换行。在较旧的Mac上,这是一次回程。

答案 3 :(得分:3)

sed 's/$/\n/' states

答案 4 :(得分:1)

我认为Jeff Attwood的帖子this完美地解决了你的问题。它将向您介绍Dos,Mac和Unix上的换行符之间的差异,然后解释CR(回车)和LF(换行)的历史记录。

答案 5 :(得分:1)

sed可以用于多行搜索&替换模式以匹配换行符\n

要这样做sed首先必须将整个文件或字符串读入保持缓冲区(“保留空间”),以便它可以将文件或字符串内容视为“模式空间”中的单行。 。

要以便携式替换单个换行符(相对于GNU和FreeBSD sed),您可以使用转义的“真实”换行符。

# cf. http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/
echo 'California
Massachusetts
Arizona' | 
sed -n -e '
# if the first line copy the pattern to the hold buffer
1h
# if not the first line then append the pattern to the hold buffer
1!H
# if the last line then ...
$ {
# copy from the hold to the pattern buffer
g
# double newlines
s/\n/\
\
/g
s/$/\
/
p
}'

# output
# California
#
# Massachusetts
#
# Arizona
#

然而,实现相同结果会更方便:

echo 'California
Massachusetts
Arizona' | 
   sed G

答案 6 :(得分:0)

试试这个:

$ sed -e $'s/\n/\n\n/g' states

答案 7 :(得分:0)

我看到了很多sed的答案,但是对于vim没有。公平地说,vim对换行符的处理有点令人困惑。搜索 \ n ,但替换为 \ r 。我建议一般使用RTFM::help pattern,特别是:help NL-used-for-Nul

使用:substitute命令

执行所需操作
:%s/\_$/\r

虽然我认为大多数人会使用像

这样的东西
:g/^/put=''

同样的效果。

这是一种为自己找到答案的方法。通过xxd运行您的文件,这是标准vim发行版的一部分。

:%!xxd

你得到了

0000000: 4361 6c69 666f 726e 6961 0a4d 6173 7361  California.Massa
0000010: 6368 7573 6574 7473 0a41 7269 7a6f 6e61  chusetts.Arizona
0000020: 0a                                       .

这表明46是 C 的十六进制代码,61是 a 的代码,依此类推。特别是,0a(十进制10)是 \ n 的代码。只是为了踢,尝试

:set ff=dos

在通过xxd过滤之前。您将看到0d0a(CRLF)作为行终止符。

:help /\_$
:help :g
:help :put
:help :!
:help 23.4