【问题标题】:How can I execute this grep command如何执行此 grep 命令
【发布时间】:2016-04-12 01:30:26
【问题描述】:

我试图在正则表达式 101 中匹配此模式

<a href="http://google.com">Google.com</a>
<A target="_blank" href='http://example.com/files.html'>An Example</A>
<a id="link23" HREF = "file23.html" target="_TOP">File #23</a>
<a href="images/mypic.png">See my picture!</a>
<a href="mailto:joelross@uw.edu">Email Joel</a>

我做了这个正则表达式 - \s(HREF|href)\s?=\s?('|").('|")>.*

现在当我尝试通过命令行使用 grep 命令时,它会抛出一个错误。

./mdlinks.sh: line 3: unexpected EOF while looking for matching `"'
./mdlinks.sh: line 4: syntax error: unexpected end of file

这里是源文件

#! /usr/bin/env bash
CONTENT=$(curl $1)
echo "$CONTENT" | grep -E -o '<[aA].*\s(HREF|href)\s?=\s?('|").*('|")>.*<\/[aA]>' >> mdlinks.txt

【问题讨论】:

标签: regex linux bash shell grep


【解决方案1】:

您需要转义正则表达式中的单引号,并且您的 shebang 有一个额外的空间(尽管这只是样式):

#!/usr/bin/env bash
CONTENT=$(curl $1)
echo "$CONTENT" | grep -E -o '<[aA].*\s(HREF|href)\s?=\s?('\''|").*('\''|")>.*<\/[aA]>' >> mdlinks.txt

可能值得为正则表达式使用双引号,而不是单引号。您仍然需要转义表达式中的双引号,但转义双引号更简洁:

#!/usr/bin/env bash
CONTENT=$(curl $1)
echo "$CONTENT" | grep -E -o "<[aA].*\s(HREF|href)\s?=\s?('|\").*('|\")>.*<\/[aA]>" >> mdlinks.txt

【讨论】:

  • 非常感谢您的回复。但我仍然面临问题,mdlinks 文件只匹配 1 个锚标记,而不是文件中存在的所有锚标记
  • 这是您的正则表达式的问题。尝试使用非贪婪匹配(*?)而不是贪婪匹配(*,这是默认行为)。
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多