例如,假設我有一個文本文件example.txt,其內容如下: 我喜歡狗。 我最喜歡的狗是喬治,因爲他是我的狗。 喬治是一隻不錯的狗。如何提取字符串後面的第一個單詞?
現在我怎麼提取「喬治」,因爲它是「我最喜愛的狗」之後的第一個單詞?
如果存在多於一個空間,例如 我最喜歡的狗是喬治.....
無論「我最喜愛的狗是」還是「喬治」之間的空格數量,有沒有辦法可靠地提取單詞「喬治」?
例如,假設我有一個文本文件example.txt,其內容如下: 我喜歡狗。 我最喜歡的狗是喬治,因爲他是我的狗。 喬治是一隻不錯的狗。如何提取字符串後面的第一個單詞?
現在我怎麼提取「喬治」,因爲它是「我最喜愛的狗」之後的第一個單詞?
如果存在多於一個空間,例如 我最喜歡的狗是喬治.....
無論「我最喜愛的狗是」還是「喬治」之間的空格數量,有沒有辦法可靠地提取單詞「喬治」?
你可以這樣做:
cat example.txt | perl -pe 's/My favorite dog is\s+(\w+).*/\1/g'
它輸出Geroge
如果您沒有安裝perl的,你可以使用SED:
cat example.txt | sed 's/my favourite dog is *\([a-zA-Z]*\) .*/\1/g'
謝謝。我可以問一下這是最快的 - 使用bash(sed),pearl還是別的東西? – Feynman 2010-08-23 18:13:07
我不知道,但我會猜測,由於更快的啓動,sed比perl更小的文件更快。對於較大的文件,我不知道。 – 2010-08-23 18:41:37
@Feynman:'sed'與Bash沒有任何關係,反之亦然,除了'sed'是一個shell可以產生的程序,Bash是一個shell。但是,您可以使用Bash來進行字符串提取(請參閱我的答案)。 – 2010-08-23 18:58:06
純擊:
string='blah blah ! HEAT OF FORMATION 105.14088 93.45997 46.89387 blah blah'
pattern='HEAT OF FORMATION ([^[:blank:]]*)'
[[ $string =~ $pattern ]]
match=${BASH_REMATCH[1]}
如果你想搜索一個文件,尤其是如果你有一個大文件的話,使用像sed/awk/perl這樣的外部工具比使用純粹的bash循環和bash字符串操作要快。
sed 's/.*HEAT OF FOMATION[ \t]*\(.[^ \t]*\).*/\1/' file
純粹的bash字符串操作只有在處理腳本中的幾個簡單字符串時纔有用。就像操縱一個變量一樣。
謝謝!如果我想從 等等提取105.15088那麼怎麼辦?等等吧!!熱的形成105.14088 93.45997 46.89387 等等等等 – Feynman 2010-08-23 17:57:52
你可以嘗試'貓輸入| perl -pe's/blah blah!形成的熱\ s +(\ s +)\ s。*/\ 1/g'' – codaddict 2010-08-23 18:02:34
無用的'cat'(兩次)。 – 2010-08-23 18:59:20