2017-02-16 70 views
0

我找到了一個很好的answer,它解釋瞭如何從字符串變量中刪除指定的模式。在這種情況下,刪除「富」我們使用以下命令:從bash中的字符串中刪除指定的字符串模式

string="fooSTUFF" 
string="${string#foo}" 

不過,我想補充的「OR」功能,將能夠在情況下,當刪除「富」或「噓」我的字符串以其中的任何一個開頭,如果它不以'foo'或'boo'開頭,則保持字符串不變。所以,修改後的腳本應該看起來像這樣:

string="fooSTUFF" 
string="${string#(foo OR boo)}" 

這怎麼能正確實施?

回答

2

您需要的是一個extended glob pattern(與shopt -s extglob啓用):

$ str1=fooSTUFF 
$ str2=booSTUFF 
$ str3=barSTUFF 
$ echo "${str1#@(foo|boo)}" 
STUFF 
$ echo "${str2#@(foo|boo)}" 
STUFF 
$ echo "${str3#@(foo|boo)}" 
barSTUFF 

@(pat1|pat2)相匹配|分離的模式之一。

@(pat1|pat2)是您的問題的一般解決方案(多種模式);在一些簡單的情況下,您可以不用擴展球:

echo "${str#[fb]oo}" 

也適用於您的具體示例。

+0

感謝您參考手冊。你能否就「(與shopt -s extglob有關)」問題擴展你的答案?應該放在劇本中的哪個位置?我需要在某個時候禁用它嗎?怎麼做? – Nazar

+0

@Naz'shopt -s extglob'命令必須在使用'@(...)'模式之前的任何時候發出。保持打開狀態不會受到傷害,但是如果您想明確地關閉它,只需發出'shopt -u extglob'。請注意,對於'[[$ var = pattern]]'條件,自動啓用擴展宏。有關'shopt'命令的更多信息,請參見[手冊](https://www.gnu.org/software/bash/manual/bashref.html#The-Shopt-Builtin)。 –

3

如果已設置與

shopt -s extglob 

extglob(擴展水珠)外殼選項,那麼你可以寫:

string="${string#@(foo|boo)}" 

擴展模式在bash manual記錄;他們採取如下形式:

  • ?(pattern-list):匹配給定模式的零次或一次出現。

  • *(pattern-list):匹配零個或多個出現的給定模式。

  • +(pattern-list):匹配一個或多個出現的給定模式。

  • @(pattern-list):匹配給定模式之一。

  • !(pattern-list):匹配除給定模式之外的任何內容。

在所有情況下,pattern-list是由分離的模式列表|

+0

感謝您的參考手冊。你能否就「(與shopt -s extglob有關)」問題擴展你的答案?應該放在劇本中的哪個位置?我需要在某個時候禁用它嗎?怎麼做? – Nazar

+0

@Naz:如果你有一個腳本,你可以在腳本的任何位置放置該行(當然,在使用擴展模式之前)。通常情況下,你不需要禁用它,因爲很難看到看起來像擴展模式的東西,但是如果它干擾了其他一些腳本,可以用'shopt -u extglob'(-s:set, - 你沒有設置)。在許多發行版(例如debian/ubuntu)中,您會發現它在交互式shell中啓用,因爲它被命令完成腳本使用。但在非交互式shell中,您需要在腳本中啓用它。 – rici

-1

您可以使用:

string=$(echo $string | tr -d "foo|boo") 
+0

當它不在字符串的開頭時,它也會刪除'foo'或'boo'。 –

+0

以及所有'o's,'f's,'b's和垂直條不會碰到'foo'或'boo'的一部分。 – rici

+0

是的,這將是一個問題,因爲我只需要從一開始就刪除特定的模式。 – Nazar