我开始使用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'
出了什么问题,我该如何解决?
感谢。
答案 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
是第一个\(...\)
&
是整个匹配的模式。由于我们匹配^...$
这是整个原始行-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