Bash

為什麼在 bash 腳本與 bash 命令行中執行相同的 sed 正則表達式(在 grep 之後)會失敗?

  • July 12, 2014

這是腳本。當我從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"

我實際上能夠弄清楚這一點,我想我會在這里為下一個將頭撞在同一堵牆上的Google使用者添加它。

我有一個 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)。但並非如此。

這是我的新設置(我認為--color標誌GREP_OPTIONS是多餘的,但我把它留在那裡作為提醒):

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

這樣,每當我在命令行上時,我都會突出顯示我所有的 grep(這通常是我想要的)。但是在腳本中,只有在不通過管道傳輸到另一個命令時才會預設著色。我仍然必須將 –color=always 添加到我的許多腳本中(因為在大多數情況下我更喜歡突出顯示,即使在管道到另一個命令時,除非我看不到輸出)。

引用自:https://unix.stackexchange.com/questions/143798