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

sed/awk regex with capture - how to get a somewhat simple regex to work?

FILE.txt 的示例内容如下所示。我将如何修改 SED 使用的正则表达式来进行捕获,从而产生所需的输出部分?如果可能,最好使用 POSIX awk 或 sed 函数。我研究过仅使用 AWK 来执行此操作,但没有遵循您如何使用它提供的选项创建与捕获相同的行为。

我 运行 尝试各种解决方案时遇到的一个问题是如何使双引号可选。

sed -e 's/.Include .*"*\(.*\)"*//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

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

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

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

兼容

注意:假设您不希望输出中出现“#############”字符串,并且仅基于您提供的示例...

awk/sed 组合怎么样:

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

可能不如单个 sed 命令有效,但更容易 understand/maintain (K.I.S.S.),除非您将这种构造称为 LOT 那么性能差异可以忽略不计。

或者一个纯粹的 awk 示例(并且比 awk/sed 想法更有效):

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