2016-10-21 12 views
2

sedがコマンドラインから実行されるかシェルスクリプトから実行されるかによって、sedの動作が異なるのはなぜですか?ここでは基本的な例だ:シェルスクリプトでsedの動作が異なるのはなぜですか?

$ 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は、POSIX正規表現の文字クラス(でも-Eフラグ付き)標準BREかEREではありません。これは、シェルスクリプトからコマンドを実行するときに動作しない、REsに対するPerlのようなGNU拡張のようなものです。実際、\wをPOSIX [[:alnum:]]に変更すると、私の意図通りに機能します。 GNU拡張は、シェルスクリプト(大文字/小文字の\U\Lを含む)からは機能しないようです。だからsedシェルスクリプトから実行しているかどうかを検出し、厳密なPOSIX専用モードを入力しようとしますか?これに関する文書はありますか?この動作を無効にすることはできますか?

(これはgsed (GNU sed) 4.2.2ある)

+1

は再生できません。 MSYSを使用するWindows 10&sed 4.2.2&あなたのテストデータ。コマンドラインやシェルから適切な結果が得られます。 –

+0

うわー、私は矛盾を見つけました。長い間、私は '〜/ .bash_profile'で' gsed 'に 'sed'のエイリアスを付けました。私は以前に 'sed'を確認していたが、 'type sed'を再確認しなかった。 –

答えて

2

問題は、私がsedgsedに変えるロング忘れbashのエイリアス持っていたことを単にだった - 自作によってインストールされたとして、GNU版を。そのため、sed --versionは、コマンドラインでgsedと報告された理由が説明されています。私はスクリプトとプロンプトの両方からwhich sedをチェックしましたが、私はtypeとbashエイリアスについては考えていませんでした。

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

私は同じ問題を抱え、エイリアスを忘れてしまった!ありがとうございました! – Jondlm

関連する問題