2016-10-21 46 views
2

爲什麼sed的行爲有所不同,取決於它是從命令行還是shell腳本運行?這裏有一個簡單的例子:爲什麼sed在shell腳本中的行爲不同?

$ cat test.txt 
foo 
bar 
baz 

$ sed -e 's/^b\(\w*\)$/q\1/g' test.txt # works as intended 
foo 
qar 
qaz 

$ cat test.sh # The exact same command 
sed -e 's/^b\(\w*\)$/q\1/g' test.txt 

$ bash test.sh 
foo 
bar 
baz 

現在,我進一步調查此,\w不是一個標準的BRE或ERE(甚至與-E標誌)在POSIX正則表達式字符類。當我從shell腳本運行命令時,這些類似於RE的Perl類GNU擴展不起作用。事實上,如果我將\w更改爲POSIX [[:alnum:]],它的工作方式與我的意圖相同。似乎沒有任何GNU擴展可以通過shell腳本運行(包括大寫/小寫\U\L)。 sed是否嘗試檢測它是否從shell腳本運行並進入某種嚴格的POSIX-only模式?是否有關於此的文檔?我可以禁用此行爲嗎?

(這是gsed (GNU sed) 4.2.2

+1

無法重現。使用MSYS Windows 10&sed 4.2.2和您的測試數據。我從命令行或shell得到正確的結果。 –

+0

Ooooh,我發現了這個差異。很久以前,我在'〜/ .bash_profile'中將'sed'設置爲'gsed'。我以前已經驗證過'哪個sed',但是我沒有仔細檢查'type sed'。 –

回答

2

的問題只是,我有一個長期被遺忘的bash別名改變sedgsed - 如安裝了自制的GNU版本。這解釋了爲什麼sed --version在命令行上自己報告爲gsed。我從腳本和提示中檢查了which sed,但我沒有考慮type和bash別名。

$ type sed 
sed is aliased to `gsed' 
+0

我有同樣的問題,忘了別名!謝謝! – Jondlm

相關問題