带捕获的sed / awk正则表达式 - 如何让一个简单的正则表达式工作?

时间:2017-05-25 22:15:04

标签: regex bash awk sed ksh

FILE.txt的示例内容如下所示。如何修改SED使用的正则表达式进行捕获,从而产生所需的输出部分?如果可能的话,更喜欢使用POSIX 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 个答案:

答案 0 :(得分:1)

使用扩展正则表达式来避免不必要的\(\),并使用[[:blank:]]作为包含空格和制表符的字符类。 ?表示0或1个匹配项。 +表示1个或更多。

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

注意:扩展正则表达式的-E选项(而不是-r)使其与旧版本的sed兼容

答案 1 :(得分: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命令有效,但更容易理解/维护(KISS),除非你将这种构造称为 LOT ,否则性能差异可以忽略不计。< / p>

或者纯粹的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