2016-09-05 4 views
2

コマンドラインから提供された情報に基づいて数多くの文字列置換を実行するプロジェクトワークフローの新しいインスタンスを作成するためにいくつかのreposを取得するために使用するBashスクリプトがあります。Bashスクリプトsedの使用がZSHで問題を引き起こす

同僚はZSHを使用していて、スクリプト内でsedを使用した結果、問題が発生しています。具体的には、それは正規表現を処理していないようだ?たとえば、次のエラーが発生...

# Author Name. 
    if [[ $authorname ]] 
    then 
    sed -i "" "s/Author Name/$authorname/g" "$file" 
    fi 

sed: can't read "s/Author Name/$authorname/g" : No such file or directory 

私たちは、文字列置換エラーの大半は離れて行く-eフラグを追加することによって、しかし彼はまだAを取得することを発見しました「が見つかりません」エラーの数...

sed: can't read : No such file or directory 

はバッシュとZSH優しいの両方で文字列置換を行うためのより良い方法はありますか?

答えて

1

推測あなたはBSD sedような場所でファイルを編集するためのパターンのような-i ""を負いませんGNU sedを、使用しています。単純に行う、

sed -i"" "s/Author Name/$authorname/g" "$file" 

それとも、任意のバックアップを取っていないとして:あなたは間にスペースを削除する必要が

-i[SUFFIX], --in-place[=SUFFIX]

sed -i "s/Author Name/$authorname/g" "$file" 
+0

この意志man sedから

しかし、BSDで失敗する。実際には、プラットフォーム間で '-i'を使用する移植可能な方法はありません。 – tripleee

+0

また、 'sed -i" "...'は 'sed -i ...'と*正確に*等価です。 '-i" "'は引用符を削除した後、 '-i'と同じ単語です。 – chepner

1

あなたが行う場合に:

sed -i "" "s/Author Name/$authorname/g" "$file" 

最初の引数""が正規表現とみなされており、他のファイルを、あなたが取得しているので、エラーとして。

コマンドラインの""を削除するだけです。

あなたのコマンドは、あなたが行うことができますダイナミックであれば代わりに、:

sed -i -e "" -e "s/Author Name/$authorname/g" "$file" 

最初の正規表現は無視されます。

関連する問題