我从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'怎么了,我该怎么解决呢?
谢谢。
发布于 2014-01-05 08:21:17
你可以这样做:
sed -ne 's/^\(\w\+\)\(\W\+\w\+\)\{3\}$/\1 \1 &/p' 如果您使用的是GNU,那么使用这样的-r标志就更容易读了:
sed -nre 's/^(\w+)(\W+\w+){3}$/\1 \1 &/p'解释:
-n标志不打印行,只使用sed中的显式p命令\w是一个单词字符,\W是一个非单词字符。\1是第一个\(...\)捕获的匹配&是整个匹配模式。因为我们要匹配^...$,这是整个原始行-r (-E in BSD sed),我们可以将\(....\)简化为(...),\+简化为+,\{...\}简化为{...}。我不确定\w和\W是否能在所有系统中工作。如果它不起作用,您可以使用类似[a-zA-Z0-9_]的东西来代替\w,用[^a-zA-Z0-9_]代替\W。
发布于 2014-01-05 06:42:25
Awk方法您可以尝试
$ cat file
Hello hi 123
if a equals b
you
one abc two three four
dany uri four 123Awk示例
$ 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发布于 2014-01-05 08:22:24
这可能对您有用(GNU sed):
sed -nr '/^(\S+)(\s\S+){3}$/s//\1 \1 &/p' filehttps://stackoverflow.com/questions/20930835
复制相似问题