为什么相同的 sed 正则表达式(在 grep 之后)在 bash 脚本与 bash 命令行中运行时会失败?

为什么相同的 sed 正则表达式(在 grep 之后)在 bash 脚本与 bash 命令行中运行时会失败?

这是脚本。当我从以下位置运行它时就成功了BASH 提示符,但不在脚本中。有任何想法吗?


当我说“失败”时,我的意思是sed regex不匹配任何内容,因此没有替换的文本。当我在命令行上运行它时,它匹配。

另外,我可能对此有一个答案。这与我的grep别名和GREP_OPTIONS奇怪的相互作用有关。我会回复这些细节。

#!/bin/bash

for ((x = 101; x <= 110; x++)); do
    urls="${urls} www$x.site.com/config"
done;

curl -s ${urls} | grep -i "Git Commit" | sed -r "s/.*Git Commit<\/td><td>([^<]+).*/\1/g"

答案1

我实际上能够弄清楚这一点,并且我想我会将其添加到这里,以便下一个将头撞到同一堵墙上的谷歌员工。

我有一个 grep 别名 GREP_OPTIONS放。这导致颜色突出显示在脚本中保留,即使在管道到另一个命令时也是如此。这通常不能很好地配合sed.

这是我的 .alias 和选项:

alias grep='grep -i --color'
export GREP_OPTIONS="--color=always"

因此,当从脚本运行时,它不使用别名命令,因此强制颜色始终打开。因此,当我检查我的别名并看到该--color选项时(这意味着auto,这意味着“不要对通过管道传输到另一个命令的输出进行着色”(例如sed)。

GREP_OPTIONS我很困惑,因为我忘记了我也设置了,所以我希望grep脚本中的 已color设置auto为默认(如果我没有设置 global ,就会如此GREP_OPTIONS)。但事实并非如此。

这是我的新设置(我认为标记--colorGREP_OPTIONS多余的,但我将其留在那里作为提醒):

alias grep='grep --color=always'
export GREP_OPTIONS="--ignore-case --color"

这样,每当我在命令行上时,我都会突出显示所有 grep(这通常是我想要的)。但在脚本中,只有在未通过管道传输到另一个命令时,它才会默认着色。我仍然需要在许多脚本中添加 --color=always (因为在大多数情况下我倾向于突出显示,即使在管道到另一个命令时也是如此,除非我看不到输出)。

相关内容