sed를 사용하여 텍스트 블록에서 여러 교체를 수행하는 방법은 무엇입니까?

sed를 사용하여 텍스트 블록에서 여러 교체를 수행하는 방법은 무엇입니까?

다음과 같은 패턴의 블록이 있는 텍스트 파일이 있습니다.

# cat file
Jit .... enabled=false
Jit ..shoes.. From=2021-01-01
Jit ..gloves.. From=2021-01-01

그래서 저는 일치하는 정규식을 모두 변경하여 다음 줄이 포함된 sed 파일을 작성하고 싶습니다.

# cat sedfile
/^Jit/ {

    s/enabled=false/enabled=true/g
    s/From=\d+-\d+-\d+/From=2021-02-01/g
}

패턴 /^Jit/grep 라인은 다음으로 시작합니다.힘내교체할 다른 단계도 있습니다. 날짜는 무엇이든 될 수 있으므로 하드코딩할 수 없으므로 패턴이 일치해야 합니다.

원하는 출력:

Jit .... enabled=false
Jit ..shoes.. From=2021-01-01
Jit ..gloves.. From=2021-01-01

답변1

sed는 모릅니다 \d. 표준 [0-9]문자 클래스를 사용하세요.

$ cat sedfile
/^Jit/ {

    s/enabled=false/enabled=true/
    s/From=[0-9]+-[0-9]+-[0-9]+/From=2021-02-01/
}

그러면 다음과 같이 할 수 있습니다:

line1
Jit .... enabled=false
Jit .... From=2021-01-01
line4

$ sed -Ef sedfile file
line1
Jit .... enabled=true
Jit .... From=2021-02-01
line4

또는 스크립트 파일 없이:

$ sed -E '/^Jit/{s/enabled=false/enabled=true/; s/From=[0-9]+-[0-9]+-[0-9]+/From=2021-02-01/}' file
line1
Jit .... enabled=true
Jit .... From=2021-01-01
line4

g패턴이 한 줄에 한 번만 나타나는 것 같아서 수정자를 제거했습니다 .

답변2

나는 (보다 포괄적인 샘플이 입력될 때까지) 줄의 끝 패턴이 엄격하다고 가정하는 솔루션을 생각해 냈습니다. 그렇다면 더 복잡한 매칭이 필요하지 않을 것입니다.

/^Jit/{
  s/false$/true/
  s/[0-9\-]\+$/2021-02-01/
}'

산출:

Jit .... enabled=true
Jit .... From=2021-02-01

g제거된 플래그 에 대해서는 다음을 참조하세요.@terdon의 답변.

관련 정보