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 /'

관련 정보