다음과 같은 패턴의 블록이 있는 텍스트 파일이 있습니다.
# 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의 답변.