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