【发布时间】:2015-02-14 20:20:32
【问题描述】:
我有一些文字如下:
path => ["/home/Desktop/**/auditd.log",
"/home/Desktop/**/rsyslog*.log",
"/home/Desktop/**/snmpd.log",
"/home/Desktop/**/kernel.log",
"/home//Desktop/**/ntpd.log",
"/home/Desktop/**/mysql*.log",
"/home/Desktop/**/sshd.log",
"/hme/Desktop/**/su.log",
"/home/Desktop/**/run-parts(.log"
]
我想提取[]里面的值,所以我这样做:
sed -n 's/.*\[\(.*\)\]/\1/p'
Sed 没有返回任何内容。
如果我执行sed -n 's/.*\[\(.*\)log/\1/p,它会正确返回[ 和log 之间的字符串。
"/home/Desktop/**/auditd.",
所以它可以在行内搜索。
如何做到这一点?
编辑:
我创建了一个包含内容的文件:
path => [asd,masd,dasd
sdalsd,ad
asdlmas;ldasd
]
当我执行grep -o '\[.*\]' 时,它不起作用,但grep -o '\[.*' 这将返回第一行[asd,masd,dasd。所以它适用于单行而不是多行。
【问题讨论】:
-
sed 是面向行的。您的第一个模式与输入中的任何行都不匹配。
-
那么如果必须提取多行,如何提取? Grep 还返回同一行的搜索
-
如果您需要在行之间匹配内容,请使用
awk之类的东西或一些可以真正理解输入格式的工具。 this question 的最后一点向您展示了一个非常方便的用于行范围处理的 awk 模式。 -
我确实使用了 awk:
awk '/\[/,/\]/',但它返回的输出与输入相同,因为它在输出中包含path => -
这个文件的输出是什么?似乎是一种数据结构