2017-05-25 63 views
0

FILE.txt的示例內容如下所示。我如何修改SED使用的正則表達式來執行捕獲,從而產生所需的輸出節?如果可能,最好使用POSIX awk或sed函數。我已經考慮完全使用AWK來完成這個工作,但是我沒有遵循如何使用它提供的選項創建與捕獲相同的行爲。帶捕獲sed/awk正則表達式 - 如何讓一個簡單的正則表達式工作?

一個我碰到的嘗試各種解決方案的問題是如何使雙引號可選。

sed -e 's/.Include .*"*\(.*\)"*/\1/g' FILE.txt 


FILE.txt 
########################################################################## 
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI Multiviews 
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec 
# Possible values include: debug, info, notice, warn, error, crit, 
# does not include the trailing slash. 
AddOutputFilter INCLUDES .shtml .html 
    Options -Indexes FollowSymLinks Includes 
LoadModule include_module modules/mod_include.so 
Include /opt/file.conf 
Include "/opt/file.conf" 
Include /usr/bin/abcOutput.conf 
Include /usr/bin/ed_Output.conf 
########################################################################### 


**Desired Output:** 
/opt/file.conf 
/opt/file.conf 
/usr/bin/abcOutput.conf 
/usr/bin/ed_Output.conf 
+2

12問題,並在只有2接受。請看看:?當有人回答我的問題,我應該怎麼辦(http://stackoverflow.com/help/someone-answers) – Cyrus

+0

你** **真的希望這些'###### ################################################## ###################'行會出現在輸出中?如果沒有,解決你的問題。 –

+0

刪除正則表達式開頭處的'.',對於初學者。您還需要進行匹配的是,關閉雙引號的工作 - 使用'[^「]的*''而不是*' - ! –

回答

1

使用擴展的正則表達式,以避免不必要的\(\)並使用[[:blank:]]作爲字符類,它包括空間和標籤。 ?表示0或1個匹配。 +表示1或更多。

sed -rn 's/^Include[[:blank:]]+"?([^"]+)"?/\1/p'

注:擴展正則表達式(而不是-r)的-E選項,可以與舊版本的sed

0

注意的兼容:假設你不希望「##### ########」在輸出字符串,完全基於您所提供的例子...

怎麼樣的awk/sed的組合:

$ awk '/^Include/ { print $2 } ' FILE.txt | sed 's/\"//g' 
/opt/file.conf 
/opt/file.conf 
/usr/bin/abcOutput.conf 
/usr/bin/ed_Output.conf 

也許不如單個sed命令有效,但更容易理解/維護(K.I.S.S.),除非您稱這種構造爲LOT,則性能差異可以忽略不計。

或純AWK例(和位比AWK/SED想法更有效):

$ awk '/^Include/ { gsub("\"","") ; print $2 } ' FILE.txt 
/opt/file.conf 
/opt/file.conf 
/usr/bin/abcOutput.conf 
/usr/bin/ed_Output.conf 
+0

或'awk的-F '[「]' '/ ^包含/ {打印$ 2 $ 3}' file' – Cyrus

相關問題