我该如何执行这个grep命令

时间:2016-04-11 17:18:23

标签: regex linux bash shell grep

我试图在正则表达式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>

我做了这个regex-&lt; [aA]。 \ s(HREF | href)\ s?= \ s?('|“)。('|”)&gt;。 * LT; / [AA]&GT;

现在,当我尝试通过命令行使用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

1 个答案:

答案 0 :(得分: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