2015-12-26 78 views
1

我在bash腳本中測試了一些字符串操作的東西,我很快意識到它不理解正則表達式(至少不是用於字符串操作的語法),然後我嘗試了一些glob表達式它似乎明白其中的一些,有些則沒有。具體而言:

FINAL_STRING=${FINAL_STRING//<title>/$(get_title)} 

是我想要使用的主要操作和上面的線工作,與$(get_title)$FINAL_STRING更換的<title>所有出現......和

local field=${1/#*:::/} 

作品,分配$1從一開始到第一次出現:::都沒有任何東西(刪除)。但#做我所期望的^要做。 當我試圖在這裏使用的{,,}全局正則表達式:

FINAL_STRING=${FINAL_STRING//{<suffix>,<extension>}/${SUFFIX}} 

通過${SUFFIX}取代的<suffix> OR <extension>任何事件,它的工作原理不是。

所以我看到它不需要正則表達式,它也不採用全局模式...所以它需要什麼?是否有任何符號/表達式被純粹的bash字符串操作理解的詳盡列表(特別是子字符串替換)?或者是*,?,#,##,%%%唯一有效的東西?

(我想只依靠普通的bash,而不調用sedgrep做我想做什麼)

+0

一個好的StackOverflow問題範圍有限 - 要求完整詳盡的子語言列表足夠寬泛,因此有資格被關閉。也就是說,如果你想*在bash中對本地字符串操作進行擴展討論,BashFAQ#100提供了這樣的內容:http://mywiki.wooledge.org/BashFAQ/100 –

+0

參數擴展的bash-hackers頁面也非常棒參考:http://wiki.bash-hackers.org/syntax/pe –

+0

至於在體育用品內部使用撐杆擴展,我不知道你爲什麼期望首先工作。 Brace擴展**創建多個單詞**;一個參數擴展解析爲多個單詞是不允許的。 –

回答

2

底層細節可以在bash的手冊中找到,Shell Expansions節。完整的畫面非常複雜。

你在做什麼在Shell Parameter Expansion部分有描述。你會看到,圖案

${parameter/pattern/string} 

使用Filename Expansion規則,而那些不包括Brace Expansion - 處理命令行參數時被前面做的。文件名擴展「僅」?,*[...]匹配(除非設置了extglob)。

但參數擴展不僅僅是文件名擴展,特別是您注意到的掛鉤#%

+0

現在,打開'extglob' ,這行'INPUT_INFO = $ {INPUT_INFO // +():+()/ :::}'凍結了執行......任何想法爲什麼? –

+1

看不出任何明顯的錯誤。請發佈一個新的問題,提供足夠的信息來重現您的問題(包括您的實際投入以及您試圖實現的目標)。 – Mat

1

bash確實其實處理正則表達式;特別是[[ =~ ]]運算符,然後您可以使用魔術變量$BASH_REMATCH將其分配給變量。它很時髦,但它的工作原理。

參見:http://www.linuxjournal.com/content/bash-regular-expressions

注意這是一個bash只 破解 功能。

對於在外殼除了慶典以及工作,做這樣的事情的老學校方式的代碼確實使用#/##/%/%%連同周圍case語句循環(支持基本*水珠匹配)。

相關問題