2014-03-31 24 views
1

在一個文件中的一些特定的模式我想刪除我的文件,與3開頭的所有單詞:4:如何刪除其開始在UNIX

例如 -

輸入是

13 1:12 2:14 3:11 
10 1:9 2:7 4:10 5:2 
16 3:7 8:24 
7 4:7 6:54 

輸出應

13 1:12 2:14 
10 1:9 2:7 5:2 
14 8:24 
7 6:54 

有人可以告訴我,如果有可能使用sed命令或awk命令。

回答

0
sed 's/[[:blank:]][34]:[^[:blank:]]\{1,\}[[:blank:]]*/ /g' YourFile 

Posix符合並假定沒有(如樣本中)第一個字用3:或4:表示。

1

隨着awk

awk '{for (i=1; i<=NF; i++) 
     {if (! sub("^[34]:", "", $i)) d=d$i" "} 
     print d; d="" 
    }' file 

它通過循環的領域,只是存儲在變量d那些不與3:4:啓動。這是通過檢查sub()函數是否返回true來完成的。當循環完成時,將打印d變量。

爲您指定的文件:

$ awk '{for (i=1; i<=NF; i++) {if (! sub("^[34]:", "", $i)) d=d$i" "} print d; d=""}' file 
13 1:12 2:14 
10 1:9 2:7 5:2 
16 8:24 
7 6:54 
+0

這會在刪除字段的任何地方留下額外的空間。 – Jotne

+0

是的,我知道,@Jotne – fedorqui

+0

我現在更新了另一種不留空間的方法,就在行尾。 – fedorqui

1

使用sed

sed -r 's/ 3:[0-9]*| 4:[0-9]*//g' 


$ cat input.txt 
13 1:12 2:14 3:11 10 1:9 2:7 4:10 5:2 16 3:7 8:24 7 4:7 6:54 


$ cat input.txt | sed -r 's/ 3:[0-9]*| 4:[0-9]*//g' 
13 1:12 2:14 10 1:9 2:7 5:2 16 8:24 7 6:54 

說明:

  • -r =正則表達式搜索
  • 3:[0-9]*:搜索空間,然後3,然後:,然後[0-9]或一個數字在0到9之間,*意味着他將在前面的正則表達式搜索中搜索零個或多個匹配,這是[0-9],所以*表示在這種情況下,將在第一個數字後面搜索零個或多個數字:
  • |:手段或
  • 4:[0-9]*:同上,只是用3它將搜索4
  • //:在替換字符串,如果你把土豆身陷囹圄會鍵入它,在這種情況下, sed將根本不輸入任何內容。
  • /g:搜索所有傳遞給sed的輸入。
+0

感謝它的工作:) – Pranav

+1

在這種情況下,交替是不必要的,因爲'3 | 4'可以被'[34]'替換。然而,這不會在行的開頭刪除任何這樣的字符串,因爲它正在尋找正則表達式開頭的空格。 – potong

+0

波東是部分正確:)交替是不需要的,但如果我們假設每行的第一個數字永遠不會有:後面那麼它會正常工作。無論如何,這裏有一個更短的版本sed -r's/[34]:[0-9] * // g' – user2772936

0

假設所有字包含:並具有後至少一位數字的:

sed "s/ \([34]:[^\b]+\)//g" inputfile 

這個匹配SPACE,3或4,冒號,然後在至少一個非字邊界。它並沒有取代它,併爲整條線路做了這樣的事情。

+0

'\ b'的反面是'\ B',但是它不是一個字符,可以在這方面使用。 – potong

3

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

sed 's/\b[34]:\S*\s*//g' file 

尋找一個字邊界,然後要麼34其次:和零個或多個非空格後跟零個或多個空格和刪除他們整個線路。