sedを使用して残りの行を交換せずに行の特定の部分を置き換える方法は?

sedを使用して残りの行を交換せずに行の特定の部分を置き換える方法は?

次のファイルがあるとします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のインスタンスに置き換えて、その場所でファイルを更新することです。したがって、交換後のファイルは次のようになります。privateProduct.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。この動作を実装する方法がわかりません。どんなフィードバックや提案にも感謝します。publicprivate

ベストアンサー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 /'

おすすめ記事