这是一个非常基本的概念,但是我从来没有能够很好地expression出来。 我想拼出来,看看我哪里出错了。
如果我必须,我将如何定义一个“换行符”。 说如果我在Unix(或Windows)中创build一个新的文件,然后通过在称为“新行字符”的文件中插入一个特殊的字符存储“行尾”信息。 如果是这样,它的ascii值是多less? 我记得在C程序中,我已经检查读取的字符值'\ n'。 为什么这个混淆的2个字符代表行尾字符..
bash$ cat states California Massachusetts Arizona
说,我想在行之间插入一个行空间,并希望forms的输出:所需的输出:
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进一步逃脱。
谢谢,
Jagrati
从sed
手册页 :
通常情况下,sed循环地将一行输入(不包括其终止换行符)复制到一个模式空间中(除非在“D”函数之后有某些东西),将所有命令应用于选择该模式空间的地址,复制模式空间到标准输出,附加一个换行符,并删除模式空间。
它在没有换行符的情况下运行,所以你在那里的模式是不可能匹配的。 你需要做别的事情 – 比如和$
(行尾)或^
(行首)匹配。
下面是一些对我有效的例子:
$ cat > states California Massachusetts Arizona $ sed -e 's/$/\ > /' states California Massachusetts Arizona
我在sed
行后面输入了一个字面换行符。
NewLine(\ n)是10(0xA)和CarriageReturn(\ r)是13(0xD)。
不同的操作系统为文件选择不同的行尾表示。 Windows使用CRLF(\ r \ n)。 Unix使用LF(\ n)。 较旧的Mac OS版本使用CR(\ r),但OS X切换到Unix字符。
这是一个相对有用的FAQ 。
转义字符依赖于解释它们的任何系统。 \n
被许多编程语言解释为一个换行符,但这并不一定适用于您提到的其他实用程序。 即使他们将\n
视为换行符,也可能有其他一些技巧让他们按照自己的意愿行事。 你将不得不咨询他们的文档(或在这里看到其他答案)。
对于DOS / Windows系统,换行符实际上是两个字符:回车符(ASCII 13,AKA \r
),然后是换行符(ASCII 10)。 在Unix系统上(包括Mac OSX),这只是换行。 在较旧的Mac上,这是一个单一的回车。
sed 's/$/\n/' states
我认为杰夫·阿特伍德的这篇文章完美地解决了你的问题。 它将带您了解Dos,Mac和Unix上换行符之间的差异,然后解释CR(回车)和LF(换行)的历史记录。
sed
可以进入多行搜索和替换模式来匹配换行符\n
。
为此, sed
首先必须将整个文件或字符串读入保留缓冲区(“hold space”),以便它可以将文件或字符串内容视为“模式空间”中的单行。
要更换一个换行(就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
尝试这个:
$ sed -e $'s/\n/\n\n/g' states
我看到很多sed的答案,但没有任何vim。 公平地说,vim对换行符的处理有点混乱。 搜索\ n,但用\ r替换。 我一般推荐RTFM :: :help pattern
,尤其是:help NL-used-for-Nul
。
要用a: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