我尝试命令sed 's/$/\r/g' linux.txt > linux2win.txt将文本文件从Linux转换为Windows。
而且起作用了!所有\n都转换为\r\n
例如,hello, world \n被转换为hello, world \r\n
让我困惑的是,$到底指的是什么?\n?还是\n前的空焦炭?我甚至不知道我换了什么。
发布于 2017-01-04 14:43:01
到目前为止,声称$与行尾匹配的答案/评论是误导的。regexp中的$与字符串的末尾匹配,仅此而已。出现以匹配sed中行尾的原因是,在默认情况下,sed每次读取一行,因此在该上下文中(但在其他上下文中),它所操作的每个字符串都在行的末尾结束。
因此,$匹配字符串的结束,如果您的字符串在一行的末尾结束,那么$在行的末尾匹配,但是如果您的字符串包含多行(例如,在sed中可以创建存储在缓冲区中的多行字符串),那么$在任何给定行的末尾都不匹配,它只是在字符串的末尾匹配,并且始终匹配。
类似地,^匹配字符串的起始点,顺便说一句,而不是像你可能听到的人们所说的那样开始行。
wrt您的评论:
my original line is hello, world \n$ and $ is invisible , and $ is replaced by \r, now my line is hello, world\n\r$ .`不,事情不是这样的。你最初的台词是:
hello, world\nsed一次读取一个\n-separated行,因此读取到seds缓冲区的是字符串:
hello, world现在,$是一个regexp元字符,它匹配字符串的末尾,因此,考虑到上面的字符串,$将在d之后匹配(而^将在h之前匹配),所以当您这样做时。
s/$/\r/它将上面的字符串更改为:
hello world\r然后,当sed输出它时,它会将换行符加回(因为没有终止换行符的字符串不是POSIX中的文本行),并将其添加到输出中:
hello world\r\n注意,$从来不是字符串的一部分,它只是一个元字符,当在regexp中使用它时,它与字符串的末尾匹配,这样您就可以测试出现在字符串末尾的字符,或者在字符串结束后执行其他操作(如上面的操作)。
发布于 2017-01-04 13:54:29
$与行尾匹配,因此命令:
sed 's/$/\r/g'只需将\r添加到行尾,这不是您所说的。如果输入是"hello,world \r\n",则输出为"hello,world \r\n“。
发布于 2017-01-04 13:59:18
你问题的前提是有缺陷的。您所提供的sed命令将Linux样式的行终止符(仅换行)转换为Windows样式(回车/换行),而不是相反。
它的工作方式如下:
$是一个regex元字符,它匹配行的零宽度端(如果有的话,就在行终止符之前)。\r);它替换了由regex匹配的零宽度字符序列,实际上是在换行符之前插入回车。sed命令中的尾随g指定应该替换每一行中的所有匹配;这是多余的,因为每行不能超过一个匹配。
还要注意,这可能有点奇怪:如果输入文件没有以换行符结尾,那么输出将以\r结尾,因为文件的末尾是最后一行的末尾。
https://stackoverflow.com/questions/41465395
复制相似问题