Sed不读多行输入?

时间:2014-12-16 13:43:22

标签: regex sed multiline

我有一些文字如下:

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。所以它适用于单行而不是多行。

4 个答案:

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