首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个sed命令是如何工作的?

这个sed命令是如何工作的?
EN

Stack Overflow用户
提问于 2017-01-04 13:49:05
回答 3查看 3.2K关注 0票数 1

我尝试命令sed 's/$/\r/g' linux.txt > linux2win.txt将文本文件从Linux转换为Windows。

而且起作用了!所有\n都转换为\r\n

例如,hello, world \n被转换为hello, world \r\n

让我困惑的是,$到底指的是什么?\n?还是\n前的空焦炭?我甚至不知道我换了什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-04 14:43:01

到目前为止,声称$与行尾匹配的答案/评论是误导的。regexp中的$与字符串的末尾匹配,仅此而已。出现以匹配sed中行尾的原因是,在默认情况下,sed每次读取一行,因此在该上下文中(但在其他上下文中),它所操作的每个字符串都在行的末尾结束。

因此,$匹配字符串的结束,如果您的字符串在一行的末尾结束,那么$在行的末尾匹配,但是如果您的字符串包含多行(例如,在sed中可以创建存储在缓冲区中的多行字符串),那么$在任何给定行的末尾都不匹配,它只是在字符串的末尾匹配,并且始终匹配。

类似地,^匹配字符串的起始点,顺便说一句,而不是像你可能听到的人们所说的那样开始行。

wrt您的评论:

代码语言:javascript
复制
my original line is hello, world \n$ and $ is invisible , and $ is replaced by \r, now my line is hello, world\n\r$ .`

不,事情不是这样的。你最初的台词是:

代码语言:javascript
复制
hello, world\n

sed一次读取一个\n-separated行,因此读取到seds缓冲区的是字符串:

代码语言:javascript
复制
hello, world

现在,$是一个regexp元字符,它匹配字符串的末尾,因此,考虑到上面的字符串,$将在d之后匹配(而^将在h之前匹配),所以当您这样做时。

代码语言:javascript
复制
s/$/\r/

它将上面的字符串更改为:

代码语言:javascript
复制
hello world\r

然后,当sed输出它时,它会将换行符加回(因为没有终止换行符的字符串不是POSIX中的文本行),并将其添加到输出中:

代码语言:javascript
复制
hello world\r\n

注意,$从来不是字符串的一部分,它只是一个元字符,当在regexp中使用它时,它与字符串的末尾匹配,这样您就可以测试出现在字符串末尾的字符,或者在字符串结束后执行其他操作(如上面的操作)。

票数 2
EN

Stack Overflow用户

发布于 2017-01-04 13:54:29

$与行尾匹配,因此命令:

代码语言:javascript
复制
sed 's/$/\r/g'

只需将\r添加到行尾,这不是您所说的。如果输入是"hello,world \r\n",则输出为"hello,world \r\n“。

票数 0
EN

Stack Overflow用户

发布于 2017-01-04 13:59:18

你问题的前提是有缺陷的。您所提供的sed命令将Linux样式的行终止符(仅换行)转换为Windows样式(回车/换行),而不是相反。

它的工作方式如下:

  • $是一个regex元字符,它匹配行的零宽度端(如果有的话,就在行终止符之前)。
  • 替换字符串是一个回车字符(表示为\r);它替换了由regex匹配的零宽度字符序列,实际上是在换行符之前插入回车。

sed命令中的尾随g指定应该替换每一行中的所有匹配;这是多余的,因为每行不能超过一个匹配。

还要注意,这可能有点奇怪:如果输入文件没有以换行符结尾,那么输出将以\r结尾,因为文件的末尾是最后一行的末尾。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41465395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档