首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >脚本打印4字行

脚本打印4字行
EN

Stack Overflow用户
提问于 2014-01-05 06:27:08
回答 3查看 227关注 0票数 0

我从sed开始,我需要遍历文件的行,用准确的4个单词打印行,在这些行中,我应该打印第一个单词3次。

我的意思是,如果这个文件是:

代码语言:javascript
运行
复制
Hello hi 123
if a equals b
you
one abc two three four
dany uri four 123

这是输出:

代码语言:javascript
运行
复制
if if if a equals b
dany dany dany uri four 123

我就是这样做的:

代码语言:javascript
运行
复制
sed `s/\(\<.\+\>\)\(\<.\+\>\)\{3\}/\1/` F1

其中F1是一个现有的文件。我被告知把所有的\都放进去,这样bash翻译就不会碰它了。下面是没有它们的脚本:

代码语言:javascript
运行
复制
sed 's/(<.+>)(<.+>){3}/\1' F1

错误是:

代码语言:javascript
运行
复制
./P8.1: line 1: s/(<.+>)(<.+>){3}/1/: No such file or directory sed: -e expression #1, char 1: unknown command: `F'

怎么了,我该怎么解决呢?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-05 08:21:17

你可以这样做:

代码语言:javascript
运行
复制
sed -ne 's/^\(\w\+\)\(\W\+\w\+\)\{3\}$/\1 \1 &/p' 

如果您使用的是GNU,那么使用这样的-r标志就更容易读了:

代码语言:javascript
运行
复制
sed -nre 's/^(\w+)(\W+\w+){3}$/\1 \1 &/p'

解释:

  • 默认情况下,使用-n标志不打印行,只使用sed中的显式p命令
  • \w是一个单词字符,\W是一个非单词字符。
  • \1是第一个\(...\)捕获的匹配
  • &是整个匹配模式。因为我们要匹配^...$,这是整个原始行
  • 使用GNU中的-r (-E in BSD sed),我们可以将\(....\)简化为(...)\+简化为+\{...\}简化为{...}

我不确定\w\W是否能在所有系统中工作。如果它不起作用,您可以使用类似[a-zA-Z0-9_]的东西来代替\w,用[^a-zA-Z0-9_]代替\W

票数 2
EN

Stack Overflow用户

发布于 2014-01-05 06:42:25

Awk方法您可以尝试

代码语言:javascript
运行
复制
$ cat file      
Hello hi 123
if a equals b
you
one abc two three four
dany uri four 123

Awk示例

代码语言:javascript
运行
复制
$ awk 'NF==4{print $1,$1,$0}' file
if if if a equals b
dany dany dany uri four 123

代码语言:javascript
运行
复制
$ awk '{f = NF == 4 ? 1 : 0; $0 = $1 FS $1 FS $0}f' file
if if if a equals b
dany dany dany uri four 123
票数 2
EN

Stack Overflow用户

发布于 2014-01-05 08:22:24

这可能对您有用(GNU sed):

代码语言:javascript
运行
复制
sed -nr '/^(\S+)(\s\S+){3}$/s//\1 \1 &/p' file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20930835

复制
相关文章

相似问题

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