爲什麼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
)
無法重現。使用MSYS Windows 10&sed 4.2.2和您的測試數據。我從命令行或shell得到正確的結果。 –
Ooooh,我發現了這個差異。很久以前,我在'〜/ .bash_profile'中將'sed'設置爲'gsed'。我以前已經驗證過'哪個sed',但是我沒有仔細檢查'type sed'。 –