Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么是换行符--'\n';_C_Unix_Vim_Sed_Newline - Fatal编程技术网

C 什么是换行符--'\n';

C 什么是换行符--'\n';,c,unix,vim,sed,newline,C,Unix,Vim,Sed,Newline,这是一个非常基本的概念,但我从来没能说得那么清楚。我想试着拼一下,看看哪里出错了 如果有必要,我将如何定义“换行符”。假设我在unix(或windows)中创建了一个新文件,那么该文件是否通过在文件中插入一个称为“新行字符”的特殊字符来存储“行尾”信息。如果是,它的ascii值是多少?我记得在C程序中,我已经对照值“\n”检查了读取字符。为什么这会混淆2个字符来表示行尾字符 bash$ cat states California Massachusetts Arizona 比方说,我想在两行之

这是一个非常基本的概念,但我从来没能说得那么清楚。我想试着拼一下,看看哪里出错了

如果有必要,我将如何定义“换行符”。假设我在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中使用反斜杠来进一步转义

谢谢

Jagrati

换行符(\n)为10(0xA),回车符(\r)为13(0xD)

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

以下是一个相对有用的方法。

来自:

通常,sed循环地将输入行(不包括其终止换行符)复制到模式空间中(除非“D”函数后还有剩余内容),应用具有选择该模式空间的地址的所有命令,将模式空间复制到标准输出,添加换行符,并删除模式空间

它在没有换行符的行上运行,因此您在那里的模式永远无法匹配。您需要执行其他操作,例如匹配
$
(行尾)或
^
(行首)

下面是一个对我有用的例子:

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

Massachusetts

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

尝试以下操作:

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

转义字符依赖于解释它们的任何系统。
\n
被许多编程语言解释为换行符,但对于您提到的其他实用程序来说,这并不一定成立。即使它们确实将
\n
视为换行符,也可能有一些其他技术使它们的行为更为复杂您需要。您必须查阅他们的文档(或在此处查看其他答案)


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

我认为杰夫·阿特伍德的帖子完美地解决了你的问题。它带你了解Dos、Mac和Unix上换行的区别,然后解释CR(回车)和LF(换行)的历史.

sed
可以置于多行搜索和替换模式,以匹配换行符
\n

为此,sed首先必须将整个文件或字符串读取到保持缓冲区(“保持空间”)中,以便它可以将文件或字符串内容视为“模式空间”中的一行

要可移植地替换单个换行符(关于GNU和FreeBSD
sed
),可以使用转义的“real”换行符

然而,更方便的方法是实现相同的结果:

echo 'California
Massachusetts
Arizona' | 
   sed G

我看到了很多sed答案,但vim没有。公平地说,vim对换行符的处理有点混乱。搜索\n,但替换为\r。我推荐RTFM:
:帮助模式,尤其是用于Nul的帮助NL

要使用:替换命令执行所需操作

:%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

OS9使用了
\r
;他们将其放在OSX中并切换到匹配的UnixRight,解决了这个问题。你知道,你也可以编辑答案。:)+1。但你提到了LF,但实际上没有阐明它是什么,甚至没有阐明它代表什么。:)为什么这会混淆2个字符来表示行尾字符。-对于程序来说,它实际上不是两个字符,而是一个用反斜杠“转义”的字符。编译器理解它表示与普通ASCII“n”不同的值。在许多语言和平台中,字符转义通常用于表示本来无法表示的字符。详细说明Galactic Cowboy所说的,
\n
不是换行符,它是一种符号,在C字符和字符串文本(以及其他一些上下文)中表示换行符。当然,源代码中实际的换行符是不可见的,只是它会结束行。这就是你为什么对sed有问题的原因:
\n
不代表该程序中的换行符。我发誓我读过“什么是新手字符--'\n',太累了,这篇文章有这个问题的基本jist,但也有一些事实错误和半真半假。您最好阅读维基百科的新行主题。
\n
sed
中有效,因此您也可以使用
:help /\_$
:help :g
:help :put
:help :!
:help 23.4