패턴이 있으면 검색하고 전체 줄을 바꾸십시오. 그렇지 않으면 SED 명령을 사용하여 다른 패턴 뒤에 새 줄을 삽입하십시오.

패턴이 있으면 검색하고 전체 줄을 바꾸십시오. 그렇지 않으면 SED 명령을 사용하여 다른 패턴 뒤에 새 줄을 삽입하십시오.

를 사용하지 않는 매우 간단한 한 줄 SED 명령을 작성하려고 합니다 bash conditions.

비슷한 작업을 수행하지만 파일 끝에 추가하는 SED 명령의 경우 다음을 사용합니다.

sed -n -e '/.*MYLINE.*/!p' -e '$aVAR=MYLINE' -i /path/to/file

하지만 이번에는 줄이 삽입되는 위치가 중요하므로 특정 문자열 뒤에 있어야 합니다. 나는 다음을 시도했다:

sed -n -e '/.*MYLINE.*/!p' -e t -i '/^ANOTHER_PATTERN.*/aVAR=MYLINE' /path/to/file

그래서 나는 /path/to/file이것으로부터 피벗 할 수 있습니다

...
ANOTHER_PATTERN=SOMETHING
...

아니면 이거

...
ANOTHER_PATTERN=SOMETHING
VAR=OTHERS MYLINE
...

이것을 생산하기 위해

...
ANOTHER_PATTERN=SOMETHING
VAR=MYLINE
...

그러나 기대했던 결과를 얻지 못했습니다. 인터넷 검색을 시도했지만 소용이 없었습니다.

패턴이 있는 경우 올바르게 검색한 다음 전체 줄을 바꾸는 방법, 그렇지 않으면 SED를 사용하여 다른 패턴 뒤에 새 줄을 삽입하는 방법은 무엇입니까?

답변1

sed -e '/MYLINE/d' -e '/^ANOTHER_PATTERN/a\
VAR=MYLINE' file

줄에 패턴이 포함되어 있으면 패턴이 제거되고 패턴으로 시작하는 줄에 MYLINE해당 줄이 추가됩니다 . 파일을 제자리에서 편집하는 옵션을 추가합니다 ( 구현에서 지원하는 경우).VAR=MYLINEANOTHER_PATTERN-ised

답변2

사용 awk:

awk '/MYLINE/{next}; 
/^ANOTHER_PATTERN/{$0 = $0 ORS "VAR=MYLINE";}1' input

표현 후에는 추가 작업이 수행되지 않습니다 /MYLINE/{next}. 실제로 awk이는 s 1 인쇄 관용구를 사용할 때 레코드가 인쇄되는 것을 방지합니다. 다른 패턴이 발견되면 현재 입력 레코드( ) 는 개행 문자 다음에 가 오도록 $0변경됩니다 .$0VAR=MYLINE

관련 정보