2012-03-02 88 views
1

我有一大堆文件中的行的,我想知道如果sed的可擦寫不管它是列擦除使用sed

例如後,改變這個:

a20 is (on) Jan 15

爲:

a20 is (on)

+0

你想這一個後刪除所有行?用*文本縮短所有行*或者縮短所有行? – 2012-03-02 18:07:08

回答

3

有多種方法可以做到這一點。如果你想在每一行刪除了一切,一個括號後,只需使用:

sed -i 's/).*/)/' file.txt 

什麼上面確實是「一個括號後匹配的一切,只是一個括號更換整場比賽。」

這就是說,最簡單的工具通常是正確的。 cut提供了一種非常簡單的方法,根據您傳遞給它的delimiter將行「切分」爲塊。例如:

cut -d" " -f -3 file.txt 

現在,如果你的文件是一個有點不同,第三列不一定有一個括號結束,您可以使用awk代替。 Awk提供了更多的控制,並且比cut更精細。

例如:

awk -F' ' '{ print $1, $2, $3 }' file.txt 

什麼上面所做的是分開的每一行,使用具有-F傳遞作爲字段分隔符的字符。然後,它會打印三個第一個字段,並使用相同的字段分隔符(OFS)分隔它們。

+3

'print $ 1,$ 2,$ 3'是相同的,但比'print $ 1 OFS $ 2 OFS $ 3'更優雅, – 2012-03-02 18:00:19

+0

@glennjackman謝謝Glenn,我沒有意識到這一點。我會編輯我的答案以反映它。 – teotwaki 2012-03-02 20:53:50

1

awk是工具處理表格數據很好:

$ awk -v n=4 '{for(i=n;i<=NF;i++)$i=""}1' file.txt 

cut是另一個工具(有時候,你需要cut之前tr擠壓的空格):

$ cat file.txt | tr -s ' ' | cut -d ' ' -f 1-3 
3

你可以嘗試,而不是削減:

cut -d " " -f -3 FILENAME 
-1

是的,你可以使用SED:

sed 's/^\([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*\).*/\1/' file.txt > newfile.txt 

添加「-i」開關後,sed和(在bash),該文件將就地編輯(即輸入和輸出是一樣的)。在測試時首先進行備份。

某些版本的sed將允許您使用擴展的正則表達式,使語法更友好。使用「-r」開關:

sed -r 's/^([^ ]+ [^ ]+ [^ ]+).*/\1/' file.txt > newfile.txt 

[^ ]表示除空格以外的所有字符。 [^ ]*意味着零個或多個任意字符,除了空間 [^ ]+意味着一個或多個任意字符,除了空間 \1意味着第一個括號表達 當然代替,你總是可以使用,而不是削減:-):

cut -f-3 -d" " file.txt > newfile.txt 
+0

這必須是迄今爲止我見過的最醜陋的sed代碼... o_O – Morlock 2012-03-02 17:56:28

+0

@Glenn - 好。我已更正了代碼。我無法測試它。它可能很難看,但它回答了這個問題。我幾乎肯定會在我的代碼中使用cut。 – groovyspaceman 2012-03-02 18:06:03

0

這可能會爲你工作:

echo "a20 is (on) Jan 15" | sed 's/\(\s*\S*\)\{2\}$//' 
a20 is (on) 

向後工作有時是容易,或轉發:

echo "a20 is (on) Jan 15" | sed 's/\(\S*\(\s*\S*\)\{2\}\).*/\1/' 
a20 is (on) 
0

沒有人提到perl的方式(其相對於sed的-i,在不使用GNU平臺工作SED):perl -p -i -e 's/(on).*/(on)/' filename