unix 什么是换行符-- '\n'

yacmzcpb  于 2022-11-04  发布在  Unix
关注(0)|答案(8)|浏览(256)

这是一个非常基本的概念,但有些东西我从来没有能够表达得那么好。我想试着拼写它,看看我哪里错了。
如果我必须这样做,我将如何定义一个“换行符”呢?比如说,如果我在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?
谢谢你,
亚格拉蒂

s2j5cfk0

s2j5cfk01#

新行(\n)为10(0xA),回车(\r)为13(0xD)。
不同的操作系统为文件选择了不同的行尾表示法。Windows使用CRLF(\r\n)。Unix使用LF(\n)。较早的Mac OS版本使用CR(\r),但OS X切换为Unix字符。
下面是一个相对有用的常见问题解答。

rvpgvaaj

rvpgvaaj2#

sed man page
通常,sed循环地将一行输入(不包括其终止换行符)复制到模式空间中(除非在“D”函数之后还有剩余的内容),应用所有带有选择该模式空间的地址的命令,将模式空间复制到标准输出中,添加一个换行符,然后删除该模式空间。
它是在没有换行符的行上运行的,所以你在那里的模式永远不能匹配,你需要做别的事情--比如对$(行尾)或^(行首)进行匹配。
下面是一个对我有效的例子:

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

Massachusetts

Arizona

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

hjzp0vay

hjzp0vay3#

转义符取决于解释它们的系统。\n被许多编程语言解释为换行符,但对于您提到的其他实用程序来说,这并不一定成立。即使它们确实将\n视为换行符,可能还有其他一些技术可以让它们按照你想要的方式运行。2你必须查阅它们的文档(或者在这里查看其他答案)。
对于DOS/Windows系统,换行符实际上是两个字符:回车符(ASCII 13,AKA \r),后跟换行符(ASCII 10)。在Unix系统(包括Mac OSX)上,它只是换行符。在较旧的Mac上,它是一个回车符。

lztngnrs

lztngnrs4#

sed 's/$/\n/' states
q35jwt9p

q35jwt9p5#

我认为Jeff Attwood的this帖子完美地解决了你的问题。它带你了解了Dos、Mac和Unix上换行符之间的区别,然后解释了CR(回车)和LF(换行)的历史。

osh3o9ms

osh3o9ms6#

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
dced5bon

dced5bon7#

试试看:

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

kgsdhlau8#

我看到了很多sed的答案,但是没有一个是针对vim的。公平地说,vim对换行符的处理有点混乱。搜索\n,但替换为\r。我推荐RTFM:通常为:help pattern,特别是:help NL-used-for-Nul
要使用:substitute命令执行您想要的操作,

:%s/\_$/\r

虽然我想大多数人会用

:g/^/put=''

效果相同。
这里有一种方法可以自己找到答案。通过xxd运行您的文件,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

您将看到0d0a(CRLF)作为行终止符。

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

相关问题