【问题标题】:gnu sed remove portion of line after pattern match with special charactersgnu sed 在模式匹配后删除部分行与特殊字符
【发布时间】:2018-07-30 04:22:13
【问题描述】:

目标是使用 sed 仅返回 FF 扩展 Mining Blocker 的每一行的 url,它使用这种格式的正则表达式行:

{"baseurl":"*://002.0x1f4b0.com/*", "suburl":"*://*/002.0x1f4b0.com/*"},
{"baseurl":"*://003.0x1f4b0.com/*", "suburl":"*://*/003.0x1f4b0.com/*"},

结果应该是:

002.0x1f4b0.com
003.0x1f4b0.com

一种方法是保留suburl":"*://*/ 之后的所有内容,然后删除每个出现的/*"},

我找到了https://unix.stackexchange.com/questions/24140/return-only-the-portion-of-a-line-after-a-matching-pattern,但特殊字符有问题。

这行不通:

sed -n -e s@^.*suburl":"*://*/@@g hosts

有人能告诉我如何标记字符串中的 2 个星号,以便正则表达式将它们视为文字字符,而不是通配符吗?

编辑:

sed -n 's#.*://\*/\([^/]\+\)/.*#\1#p' hosts

不幸的是,这不起作用。

关于字符替换,感谢您指导我参考参考资料。

我将搜索到的字符串缩减为 //*/ 并使用如下 ASCII 字符代码:

sed -n -e s@^.*\d047\d047\d042\d047@@g hosts

不幸的是,这并没有输出对行的任何更改。

我的假设是:

^.*something 指定所有内容,包括一行中最后一次出现的“某事”

sed -n -e s@search@@g 删除(替换为空)一行内的“搜索”

所以,这一行:

sed -n -e s@^.*\d047\d047\d042\d047@@g 主机

应该在每行中输出//*/ 之后的所有内容...除非它没有。

那行有什么问题?

关于删除所有内容,包括第一次/之后的第一次操作,是的,这也是需要的。

【问题讨论】:

标签: sed special-characters


【解决方案1】:

这可能对你有用(GNU sed):

sed -n 's#.*://\*/\([^/]\+\)/.*#\1#p' file

贪婪匹配(匹配的最长字符串)直到://*/的所有字符,然后是不匹配/的一组字符(将被称为\1),然后是其余字符并将其替换为组@98​​7654325@。

注意sed 替换分隔符是任意的,在这种情况下选择为#,以便使模式匹配/ 更容易。此外,替换命令左侧的字符* 可能被解释为表示前一个字符/组的零个或多个的元字符,因此被引用\* 以便它不会错误地发挥此属性。最后,使用选项-n 在执行完所有 sed 命令后关闭模式空间中所有内容的常规打印。替换命令上的 p 标志,在成功替换后打印模式空间,因此只有 URL 将出现在输出中,或者什么都不出现。

【讨论】:

    最近更新 更多