2015-01-14 65 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,\}

相關問題