다음과 같은 파일이 있다고 가정해 보겠습니다 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 /'