2012-09-10 43 views
4

例如如何使用grep/awk/sed打印所有字符,直到某個模式(不包括模式本身)。

echo "abc-1234a :" | grep <do-something> 

只是打印ABC-1234A

+5

歡迎的StackOverflow!這聽起來像一個[XY問題](http://mywiki.wooledge.org/XyProblem)。 [你真的*試圖做什麼](http://meta.stackexchange.com/a/66378/174723)? – ghoti

+1

這是什麼模式?冒號?空白結腸?你只處理一行輸入(就像你的回聲),還是你在處理多行輸入?如果它是一個多行輸入,你在尋找1..N行,其中N是包含該模式的第一行,忽略其餘行,或者你是在尋找每一行的起始段直到該行上的模式? –

+0

謝謝你們!這是冒號前第一行輸入的字符。輸入可能有多行。 – user1224949

回答

11

我覺得這些都是接近什麼你得到的,但不知道你真正想實現的,這是很難說。

echo "abc-1234a :" | egrep -o '^[^:]+' 

...雖然這也會匹配沒有冒號的行。如果你只是想用冒號行,你必須只使用grep的,這可能工作:

echo "abc-1234a :" | grep : | egrep -o '^[^:]+' 

當然,這僅是有道理的,如果你的echo "abc-1234a :"是會與可能多行來替換示例輸入。

,你可以用最小的工具可能是cut

echo "abc-1234a :" | cut -d: -f1 

而且sed始終可用...

echo "abc-1234a :" | sed 's/ *:.*//' 

對於這最後一個,如果你只想打印線,其中包括冒號,將其更改爲:

echo "abc-1234a :" | sed -ne 's/ *:.*//p' 

哎呀,你甚至可以這樣做純粹的bash:

while read line; do 
    field="${line%%:*}" 
    # do stuff with $field 
done <<<"abc-1234a :" 

的信息在%%位,可以man bash並搜索「參數擴展」。

UPDATE

你說:

它在輸入的冒號前的第一行的字符。 輸入可能有多行。

grep的解決方案可能不是你最好的選擇,那麼,因爲他們也會從後續行可能包括冒號打印數據。當然,還有很多方法可以解決這個需求。我們將與樣品輸入啓動:

$ function sample { printf "abc-1234a:foo\nbar baz:\nNarf\n"; } 
$ sample 
abc-1234a:foo 
bar baz: 
Narf 

您可以使用多個管道,例如:

$ sample | head -1 | grep -Eo '^[^:]*' 
abc-1234a 
$ sample | head -1 | cut -d: -f1  
abc-1234a 

或者你可以用sed只處理的第一行:

$ sample | sed -ne '1s/:.*//p' 
abc-1234a 

或者在打印完第一行後告訴sed退出(這比讀取整個文件要快):

$ sample | sed 's/:.*//;q' 
abc-1234a 

還是做同樣的事情,但只顯示輸出,如果一個冒號被發現(安全):

$ sample | sed -ne 's/:.*//p;q' 
abc-1234a 

或者AWK做同樣的事情(最後3例,分別爲):

$ sample | awk '{sub(/:.*/,"")} NR==1' 
abc-1234a 
$ sample | awk 'NR>1{nextfile} {sub(/:.*/,"")} 1' 
abc-1234a 
$ sample | awk 'NR>1{nextfile} sub(/:.*/,"")' 
abc-1234a 

或者在bash,沒有管道都:

$ read line < <(sample) 
$ printf '%s\n' "${line%%:*}" 
abc-1234a 
+0

這是完美的!第二個選項適合我。我只是想要在第一行輸入中的冒號之前的字符。謝謝! – user1224949

+0

建議稍作修改:'sed'/:/ {s /:.*//; q;}''而不是假設只有第一行輸入是有趣的。 –

+0

@WilliamPursell - 好點,儘管OP確實說過(在對問題的評論中)字段名稱只能在第一行輸入中找到。 – ghoti

相關問題