sedで-iと-Eオプションを使用できますか?

sedで-iと-Eオプションを使用できますか?

このようなファイルがあります。

public class Constants {
    public static final String PACKAGE_VERSION = '1.24.0.1';
}

スクリプトを実行しています。

sed -E "/PACKAGE_VERSION/s/\'([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\'/\'1.24.0.2\'/g" force-app/main/default/classes/Constants.cls > temp.cls
mv temp.cls force-app/main/default/classes/Constants.cls

文字列「1.24.0.1」を「1.24.0.2」に置き換えます。

これを1行で実行できますか?ファイルをインライン編集するawk代わりに使用する必要がありますか?sed

コマンドを実行しようとすると

sed -iE "/PACKAGE_VERSION/s/\'([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\'/\'1.24.0.3\'/g" force-app/main/default/classes/Constants.cls 

現在のファイルをインラインで変更する代わりに、Constants.clsE ファイルが生成され、新しいファイルは置き換えられません。

コマンドを実行しようとすると

sed -Ei "/PACKAGE_VERSION/s/\'([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\'/\'1.24.0.3\'/g" force-app/main/default/classes/Constants.cls 

エラーが発生しました。

sed: 1: "force-app/main/default/ ...": invalid command code f

このスクリプトは、スクリプトを変更せずにMacOSとLinuxで実行したいと思います。

試してみましたが、awkファイルをインラインで編集する方法を理解していませんか?

次のコマンドを実行しようとすると

awk -v v="$version" '/PACKAGE_VERSION/{gsub(/[0-9]+(.[0-9]+){3}/,v)}1' force-app/main/default/classes/Constants.cls > force-app/main/default/classes/Constants.cls

これにより、ファイルが空になります。

ベストアンサー1

さまざまな実装は内部編集オプションをsed複製しますが、残念ながら異なるAPIを使用します。-iperl

一部は(拡張)拡張正規表現(POSIXまたはそのバリアント)を追加またはサポートし、一部は-E(非常に)高度なPerl様正規表現(PCREまたは類似)を追加またはサポートしますが、同じです(可能にすることを除く)。 POSIX規格の次のバージョンであり、現在ますます多くの実装で発見されていますが、普遍的なものはありません。-r-R-P-E

ここでは、実際の製品を使用して、これらのすべての移植性の問題を回避することもできます。

perl -i -pe "s{\bPACKAGE_VERSION\s*=\s*\K'\d+(\.\d+){3}'}{'1.24.0.3'}g" file

おすすめ記事