首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么'1,4p‘输出所有的行,而不是仅仅输出前四行?

为什么'1,4p‘输出所有的行,而不是仅仅输出前四行?
EN

Unix & Linux用户
提问于 2015-04-09 17:22:10
回答 3查看 811关注 0票数 1

我有一个名为"list“的文本文件,其中包含一些随机单词:

代码语言:javascript
复制
he
she
we
his
her
with
his this this -- this
this

我运行了sed命令:

代码语言:javascript
复制
sed '1,4p' list

我认为sed命令要做的是列出这个文件中的前4个单词,所以我认为输出应该是:

代码语言:javascript
复制
he
she
we
his

但结果却是:

代码语言:javascript
复制
he
he
she
she
we
we
his
his
her
with
his this this -- this
this

谁能告诉我我做错了什么,或者为什么输出是不同的?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2015-04-09 17:26:43

您忘记了sed的默认操作是打印每个模式空间(行),因此抑制添加-n开关所需的默认行为。

代码语言:javascript
复制
sed -n '1,4p' list
票数 13
EN

Unix & Linux用户

发布于 2015-04-09 17:29:14

用这个:

代码语言:javascript
复制
sed -n 1,4p list

或者这个:

代码语言:javascript
复制
sed '1,4!d' list

更多示例

票数 3
EN

Unix & Linux用户

发布于 2015-04-27 02:04:37

它在一般情况下所做的

您的脚本表达式将依次在每一行执行。

要在一行上执行表达式,sed将首先将其复制到模式空间。

然后,执行所有表达式,每个表达式使用模式空间作为输入,并将结果写回模式空间。

因此,通常情况下,当完成行的工作步骤时,我们在模式空间中有一个最后的字符串。在大多数情况下,我们只希望将其作为输出,例如在被多个s//命令更改之后。

因为它通常很有用,所以sed打印最后的模式空间,就好像它会附加一个p表达式一样。

您已经可以看到这会导致命令的输出。

  • 这条线被放入模式空间中。
  • 脚本使用p打印四行匹配行的模式空间
  • 当它完成时,它不会更新模式空间。
  • 因为它已经在表达式列表的末尾,所以模式空间是打印出来的,因为它是默认情况下完成的

注意,它输出的是“所有行和前四行”,而不是“所有行而不是前四行”。

因此,在重复行中,第一行是打印的,第二行是默认打印的。

默认打印模式空间的sed选项-n (--quiet)开关:

代码语言:javascript
复制
sed -n 1,4p list

要查看您的原始命令在做什么,我们可以使两种类型的行看起来不同:我们在最后打印它之前更改模式空间,方法是用-作为前缀:

代码语言:javascript
复制
$ sed -e '1,4p' -e 's/^/- /'  list
he
- he
she
- she
we
- we
his
- his
- her
- with
- his this this -- this
- this

(需要-e选项来提供多个表达式。的/^/- /‘在行的开头没有用-替换任何东西。)

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

https://unix.stackexchange.com/questions/195340

复制
相关文章

相似问题

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