sed를 사용하여 텍스트를 바꾸고 특정 패턴 뒤에 텍스트 추가

sed를 사용하여 텍스트를 바꾸고 특정 패턴 뒤에 텍스트 추가

특정 패턴 이후 파일 내의 텍스트를 바꾸려고 합니다.

예를 들어:

내용 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유일한 차이점은 줄의 일치하는 부분이 수정된다는 것입니다. 따라서 이전 부분은 ==보존되고, 이후 부분에는 ==캡처 그룹만 필요합니다.

두 패턴 사이의 동작 차이는 .*==... 가 마지막 패턴과 일치 ==하고 ==... 가 첫 번째 패턴과 일치한다는 것입니다. 왜냐하면 해당 .*부분이 뒤에 나오는 가능한 가장 긴 텍스트와 일치하기 때문입니다 ==.

관련 정보