为什么 sed 不起作用?

And*_*ins 7 command-line regex sed text-processing

我有一些 HTML 试图从中提取链接。现在文件看起来像这样。

website.com/path/to/file/234432517.gif" width="620">
website.com/path/to/file/143743e53.gif" width="620">
website.com/path/to/file/123473232.gif" width="620">
website.com/path/to/file/634132317.gif" width="620">
website.com/path/to/file/432432173.gif" width="620">
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 sed" width="620">从所有行中删除。这是我的 sed 代码:

sudo sed -i "s/\"\swidth\=\"\d+\"\>//g" output
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我用谷歌搜索的所有内容都会导致一些看起来像这样的代码,但这由于某种原因不起作用。

ter*_*don 22

因为您使用的是 PCRE(Perl 兼容正则表达式)语法并且sed不理解它,所以默认情况下它使用基本正则表达式 (BRE)。它既不知道\s也不知道\d。您也在逃避各种不需要转义的事情(既\=没有\>做任何有用的事情,也没有做任何有用的事情),而不是逃避确实需要转义的事情(+仅表示+BRE 中的符号,您需要\+“一个或更多的”。

这应该做你需要的:

sed 's/" width="[0-9]\+">//g' file
Run Code Online (Sandbox Code Playgroud)

或者,使用扩展正则表达式:

sed -E 's/"\s*width="[0-9]+">//g' file
Run Code Online (Sandbox Code Playgroud)

最后,作为一般规则,在没有首先测试的情况下,您永远不会使用它以确保它有效,或者,如果您这样做,至少使用(任何文本都可以)来创建备份。sed -i-i-i.bak-i

  • 一般来说,如果您可以选择这些东西,请选择 Perl,因为它拥有命令行工具中可用的最强大的正则表达式引擎之一。 (2认同)