次のファイルがあるとしますProduct.java
。
public class Product {
public String name;
public String description;
public String picture;
public double price;
public Product(String name, String description, String picture, double price) {
this.name = name;
this.description = description;
this.picture = picture;
this.price = price;
}
public String getName() {
return this.name;
}
public String getDescription() {
return this.description;
}
public String getPicture() {
return this.picture;
}
public double getPrice() {
return this.price;
}
public String toString() {
return "Product";
}
}
現在私がやろうとしているのは、クラスフィールドをpublic
のインスタンスに置き換えて、その場所でファイルを更新することです。したがって、交換後のファイルは次のようになります。private
Product.java
public class Product {
private String name;
private String description;
private String picture;
private double price;
...
...
...
}
私はsed
次の文を使ってこれを実行しようとしています。
sed -ri 's/public [a-zA-Z a-z]*;/private/' Product.java
しかし、これはクラスフィールドをprivate
。この動作を実装する方法がわかりません。どんなフィードバックや提案にも感謝します。public
private
答え1
ImHereは、交換のパターン部分を参照してこの問題を解決する方法をすでに説明していますが、いくつかの便利なヒントを追加したいと思いました。
- 拡張正規表現構文を使用しないでください
-r
(ただし、元のコマンドではそれを使用しません)。-E
ポータブルオプションです。 - すべての可能なシナリオが含まれているかどうかを常に検討してください。との間の
public int[] foo
改行はpublic String description2
どうですか?public
;
- 時には、反転を通じてケースを除外する方が良い場合があります。住所
sed '/{/!s/public /private /'
ラインpublic
に{
// don't allow a public setter for this member; it can only be set on instanisation
最後に、コメントや変数と呼ばれる変数があるいくつかのケース(この場合は境界線の愚かな)のような偽の肯定について考えてみてくださいrepublic
。したがって、パターンは次のようになります。^[[:space:]]*public
要約すると、より強力なスクリプトは次のとおりです。
sed '/{/!s/^\([[:space:]]*\)public /\1private /'