脚本打印4个单词的行

时间:2014-01-05 06:27:09

标签: unix sed

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

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

Hello hi 123
if a equals b
you
one abc two three four
dany uri four 123

这是输出:

if if if a equals b
dany dany dany uri four 123

这就是我所做的:

sed `s/\(\<.\+\>\)\(\<.\+\>\)\{3\}/\1/` F1

其中F1是现有文件。有人告诉我把所有的\都放进去,所以bash翻译不会触及它。这是没有它们的脚本:

sed 's/(<.+>)(<.+>){3}/\1' F1

错误是:

./P8.1: line 1: s/(<.+>)(<.+>){3}/1/: No such file or directory sed: -e expression #1, char 1: unknown command: `F'

出了什么问题,我该如何解决?

感谢。

3 个答案:

答案 0 :(得分:2)

您可以尝试使用Awk方法

$ cat file      
Hello hi 123
if a equals b
you
one abc two three four
dany uri four 123

Awk示例

$ awk 'NF==4{print $1,$1,$0}' file
if if if a equals b
dany dany dany uri four 123

$ 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

答案 1 :(得分:2)

你可以这样做:

sed -ne 's/^\(\w\+\)\(\W\+\w\+\)\{3\}$/\1 \1 &/p' 

如果您正在使用GNU sed,那么使用-r标志更可读,如下所示:

sed -nre 's/^(\w+)(\W+\w+){3}$/\1 \1 &/p'

说明:

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

我不确定\w\W是否适用于所有系统。如果它不起作用,您可以使用类似 [a-zA-Z0-9_]而不是\w[^a-zA-Z0-9_]而不是\W

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -nr '/^(\S+)(\s\S+){3}$/s//\1 \1 &/p' file