2014-01-05 19 views
0

我開始用sed,我需要在文件的行上運行,用4個單詞打印行,並在這些行中打印第一個單詞3次。用4個字打印行的腳本

我的意思是,如果這個文件中給出:

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

您最好給一個簡單的線條。 –

+0

是那些backtics? – Beta

+0

是的,所以bash解釋器不會改變我的代碼中的東西(就像我寫*一樣,它不會替換它在工作目錄中的所有文件)。 – shoham

回答

2

你可以這樣做:

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

說明:

  • 使用

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

    如果你使用的是GNU sed的,那麼它使用-r標誌這樣更具可讀性-n標誌默認情況下不打印行,只能通過明確的p命令在sed

  • \w字字符\W是一個非單詞字符
  • \1是匹配由第一\(...\)
  • &捕獲是整個匹配的模式。由於我們匹配^...$這是整個原線
  • 隨着GNU的-r的sed(-E在BSD SED),我們可以簡化\(....\)(...)\++\{...\}{...}

我m不知道是否\w\W將在所有系統中工作。如果它不起作用,您可以使用類似[a-zA-Z0-9_]而不是\w[^a-zA-Z0-9_]而不是\W

+0

非常感謝,特別是對於解釋。 – shoham

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 

OR

$ 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 
+0

謝謝,但我需要在sed。 – shoham

+0

@shoham你沒有'sed'。我沒有看到任何只有'sed'和'awk'的系統。這裏是'awk',然後'sed'來完成這項工作。 – Jotne

0

這可能爲你工作(GNU SED):

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