我有一些文字如下:
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
。所以它适用于单行而不是多行。
答案 0 :(得分:1)
尝试这样做:
$ grep -o '".*",?' file
"/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"
-o
仅适用于grep打印匹配部分"
是文字双引号.*
是"
关闭双引号,
是文字双引号?
表示o或1次出现答案 1 :(得分:1)
嗯,我有点太慢,但我认为如何将sed替换作为一个块而不是逐行地应用于整个文件的问题值得一般回答,所以我'我会在这里留下一个。
在您的具体情况下,您可以使用此模式:
sed -n 'H; $ { x; s/.*\[\(.*\)\].*/\1/; p; }' foo.txt
一般技巧是
sed -n 'H; $ { x; s/pattern/replacement/flags; p; }' file
这意味着:进入的每一行都附加到保持缓冲区(使用H
命令),并在文件末尾($
),当整个文件是在保持缓冲区中,执行括号之间的内容。在该块中,保持缓冲区与模式空间(x
)交换,然后完成替换,并打印模式空间中剩余的内容(p
)。
编辑:这个简单形式的一个警告是,如果您的模式想要匹配文件的开头,它就无法正常工作;由于原因,当首次调用sed时,保持缓冲区不是完全为空(它包含空行)。如果这很重要,那么形式会稍微复杂一些
sed -n '1 h; 1 !H; $ { x; s/pattern/replacement/flags; p; }' file
修复它。对于第一行,这将使用h
而不是H
,它会使用模式空间覆盖保持缓冲区,而不是将模式空间附加到保持缓冲区。
答案 2 :(得分:0)
您可以使用awk
替换.*[
或]
或空白空格来执行此操作:
$ awk '{gsub(/.*\[|\]| /, ""); print}' filename
"/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"
答案 3 :(得分:0)
来自您的样本,它也可能(仅处理第一行和最后一行)
sed '1s/^[^[]*\[//;$d' YourFile