특정 패턴 이후 파일 내의 텍스트를 바꾸려고 합니다.
예를 들어:
내용 example.txt
은
Something==x.y.z
나는 그것을로 바꾸고 싶다
Something>=x.y.z,<x.y.z+1.0
sed -i 's/==/>=/g' example.txt
변경 하는 데 사용할 수 있다는 것을 알고 있지만 특정 패턴 뒤에 무엇을 추가해야 할지 ==
모르겠습니다 .<x.y.z+1.0
(x.y.z
랜덤번호 이니 참고해주세요)
편집하다:Python 패키지와 함께 작동합니다. 예
argcomplete==1.12.3
youtube-dl==2021.6.6
systemd-python==234
될 것입니다
argcomplete>=1.12.3,<1.12.3+1.0
youtube-dl>=2021.6.6,<2021.6.6+1.0
systemd-python>=234,<234+1.0
답변1
다음 sed
명령은 라인에 정확히 하나만 있다고 가정 ==
하고 그 전후의 부분을 교체에 사용할 수 있는 그룹 1과 그룹 2로 추출합니다.
sed 's/\(.*\)==\(.*\)/\1>=\2,<\2+1.0/'
입력 있음
Something==x.y.z
argcomplete==1.12.3
youtube-dl==2021.6.6
systemd-python==234
출력은 다음과 같습니다
Something>=x.y.z,<x.y.z+1.0
argcomplete>=1.12.3,<1.12.3+1.0
youtube-dl>=2021.6.6,<2021.6.6+1.0
systemd-python>=234,<234+1.0
파일을 그 자리에서 편집하려면 옵션을 추가 -i
하고 파일 이름을 입력하세요.
sed -i 's/\(.*\)==\(.*\)/\1>=\2,<\2+1.0/' example.txt
설명하다:
무늬:
.
= 임의의 문자*
= 이전 패턴이 0부터 임의의 숫자까지 반복됩니다.- -->
.*
= 임의 개수의 문자 \(
...\)
= 포함된 패턴과 일치하는 텍스트를 캡처합니다.==
= 텍스트\(.*\)==\(.*\)
= 그룹 1로 캡처된 텍스트, 그 뒤에==
그룹 2로 캡처된 텍스트
대안:
\1
,\2
= 캡처 그룹 1 또는 2의 텍스트- 여기의 다른 부분은 모두 텍스트입니다.
\1>=\2,<\2+1.0
=그룹 1>=
그룹 2,<
그룹 2+1.0
에서 언급했듯이그들을주석은 ==
첫 번째 패턴 앞의 리터럴을 생략할 수 있습니다.
sed 's/==\(.*\)/>=\1,<\1+1.0/'
설명은 비슷하지만, sed
유일한 차이점은 줄의 일치하는 부분이 수정된다는 것입니다. 따라서 이전 부분은 ==
보존되고, 이후 부분에는 ==
캡처 그룹만 필요합니다.
두 패턴 사이의 동작 차이는 .*==
... 가 마지막 패턴과 일치 ==
하고 ==
... 가 첫 번째 패턴과 일치한다는 것입니다. 왜냐하면 해당 .*
부분이 뒤에 나오는 가능한 가장 긴 텍스트와 일치하기 때문입니다 ==
.