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
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