このようなファイルがあります。
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を使用します。-i
perl
一部は(拡張)拡張正規表現(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