2015-01-14 25 views
1

我有一个名为test有文件:如何使用sed将3个单词的第一个单词加倍?

1 2 3 
2 3 
4 5 6 7 
8 9 10 
11 12 13 14 15 16 17 
18 19 20 

我想有3个字在他们的线,然后打印出来,而第一个字是重复的。

我不能使用管道,我可以使用> |把它放在一个tmp文件中并从中读取。

所以在这种情况下,输出是:

1 1 2 3 
8 8 9 10 
18 18 19 20 

我明白或多或少我需要什么正规EXPR,但其余的IM挣扎,可能有人请帮助?

这是我做过什么:

sed 's/'^[^ ]*[ ]+[^ ]+[ ]+[^ ]+[ ]*$'/&&/1/ test 

我知道这是不是解决办法,但请大家帮我明白了:/

回答

3

你可以试试这个,

$ sed -nr 's/^([^ ]+) +[^ ]+ +[^ ]+$/\1 &/p' file 
1 1 2 3 
8 8 9 10 
18 18 19 20 

man sed

-n, --quiet, --silent 
      suppress automatic printing of pattern space 
p  Print the current pattern space. 

^断言,我们是在开始。 (..)称为捕获组,用于捕获字符。稍后,您可以通过反向引用索引号来引用这些捕获的字符。 ([^ ]+)一次或多次捕获任何字符,但不是空格。 +重复上一个令牌一次或多次。 $断言我们处于行结束。

OR

$ sed -n 's/^\([^[:blank:]]\+\)\([[:blank:]]\+\)[^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+$/\1\2&/p' file 
1 1 2 3 
8 8 9 10 
18 18 19 20 

[^[:blank:]]\+匹配一个或多个非空格字符。 [[:blank:]]\+匹配一个或多个空格字符。 &在替换部分将打印所有匹配的字符。

+0

谢谢!只是不得不掩盖的情况下,我有空格在一行的结尾,所以我添加了[] * $ –

+0

可以请你添加一些基本的解释到你的第一个解决方案? $ sed -nr's/^([^] +)+ [^] + + [^] + $/\ 1&/ p'档案 –

2

sed不是选择的空间分隔的数据的工具。由于已经使用的答案sed这里有一些选择:

AWK

awk 'NF==3 { print $1, $1, $2, $3 }' < test 

平原POSIX外壳

#!/bin/sh 
while IFS=' ' read -r a b c d; do 
    if [ ! -z "$a" -a ! -z "$b" -a ! -z "$c" -a -z "$d" ]; then 
     echo "$a $a $b $c"; 
    fi 
done < test 
+0

空间匹配,但我需要SED,没有awk –

+0

@nickshmick你可以使用纯粹的bash吗? – nwk

+2

'awk'NF == 3 && $ 1 = $ 1“”$ 1'' –

1

这里是一个sed解决方案,只需要一句话字符:

$ sed -n "s/^\(\([a-zA-Z0-9]\+\) [a-zA-Z0-9]\+ [a-zA-Z0-9]\+$\)/\2 \1/p" test.txt 
0
# Posix 
sed '/^\([^ ]\{1,\}\)\([^ ]\{1,\}\)\{2\}$/ !d;s//\1 &/' YourFile 

# GNU 
sed '/^([^ ]+)([^ ]+){2}$/ !d;s//\1 &/' YourFile 

假设空间仅1个空间字符(如果没有,只需更改与[[:space:]]\{1,\}

相关问题