문자열 존재에 따라 파일 편집

문자열 존재에 따라 파일 편집

file1예를 들어 다음과 같은 입력 파일이 있습니다 .

WRITE=2
START=1
SMEAR=0
MIN=6
MAX=100

내 문제는 문자열을 검색 SMEAR하고 문자열이 존재하면 전체 줄을 SMEAR=-5. 하지만 SMEAR존재하지 않는 경우 새 행을 삽입해야 합니다 SMEAR=-5. 궁극적으로 이 줄은 SMEAR=-5한 번만 나타나야 합니다. sed를 사용하여 문자열을 바꿀 수 있습니다.

 sed -i '/SMEAR/c\SMEAR=-5' file1

또는 문자열을 새 줄로 삽입할 수 있습니다.

 sed -i '10i SMEAR=-5' file1

하지만 파일에 존재하는 문자열을 기준으로 문자열을 어떻게 결합할 수 있나요?

편집하다:SMEAR값을 변수로 전달할 수 있으면 도움이 될 것입니다.

답변1

사용 사례에서는 줄 순서가 중요하지 않은 것 같습니다. 이를 감안할 때 ex간단히 다음을 사용합니다.

  1. SMEAR다음의 모든 인스턴스를 삭제합니다 .
  2. 원하는 행을 삽입하세요.

다음을 수행할 수 있습니다.

printf '%s\n' 'g/SMEAR/d' '$a' 'SMEAR=-5' . x | ex file.txt

첫 번째 명령은 정규식과 일치하는 모든 줄을 g전체적으로 삭제합니다 .d/SMEAR/

다음 명령은 a마지막 줄( ) $뒤에 줄을 추가하는 것 입니다 SMEAR=-5. 추가 할 텍스트의 끝입니다 ..

x명령은 변경 사항을 저장하고 종료합니다.

각 명령은 개행 문자로 끝나며 printf '%s\n'이를 사용하여 로 보냅니다 ex.


또한보십시오이 매우 유사한 솔루션이것은 제가 얼마 전에 vi/Vim Stack Exchange에 쓴 글입니다.


변경 사항을 저장하지 않고 변경된 파일을 명령줄에 인쇄하여 변경 사항을 테스트하려면 다음 x두 명령을 바꾸십시오.%p 'q!'

printf '%s\n' 'g/SMEAR/d' '$a' 'SMEAR=-5' . %p 'q!' | ex file.txt

%"전체 버퍼"를 의미하며 이것이 p인쇄되는 것입니다.

q!'그만두다, 변화를 포기하다'라는 뜻이다.

변경 사항을 다음에 저장합니다.새로운%p파일을 다음 으로 바꾸세요 w newfile.txt.

printf '%s\n' 'g/SMEAR/d' '$a' 'SMEAR=-5' . 'w newfile.txt' 'q!' | ex file.txt

그러면 w수정된 버퍼가 작성됩니다 newfile.txt.

또는 다음과 같이 처음부터 이 작업을 수행하고 백업을 만든 다음 변경된 파일 내용을 원래 위치에 저장할 수 있습니다 file.txt.

printf '%s\n' 'w file.txt.bak' 'g/SMEAR/d' '$a' 'SMEAR=-5' . x | ex file.txt

편집하다:실제로 사용할 필요는 없습니다 q!. 생략하는 것만으로도 x변경 사항 저장을 피할 수 있습니다. ex추가 입력을 읽으려고 시도하는 동안 EOF가 수신되면 변경 사항을 저장하지 않고 종료됩니다 .

답변2

h시도해 볼 수 있습니다. 행이 일치하면 이전 공간 에 복사하고 s값을 바꾸세요.
위도선의 $유지 공간과 패턴 공간을 변경 x하고 후자가 비어 있는지 확인합니다. 비어 있지 않으면 이미 교체가 완료되었음을 의미하므로 별도의 조치를 취할 필요가 없습니다. 비어 있으면 일치하는 항목이 없다는 의미이므로 패턴 공간이 대체되어 SMEAR=-5홀딩 버퍼의 현재 라인에 추가됩니다. 마지막으로 e가 x다시 변경됩니다.

sed '/SMEAR/{h;s/.*/SMEAR=-5/};${x;/^$/{s//SMEAR=-5/;H};x}' infile

위의 내용은 gnu sed구문입니다. 가지고 다닐 수 있는:

sed '/SMEAR/{
h
s/.*/SMEAR=-5/
}
${
x
/^$/{
s//SMEAR=-5/
H
}
x
}' infile

대체 방법 ed:

ed -s infile<<\IN || printf %s\\n SMEAR=-5 >> infile
/SMEAR.*/s//SMEAR=-5/ 
w
q
IN

패턴과 일치하는 줄이 없으면 ed오류가 발생하므로 printf...두 번째 명령( )이 실행되어 해당 줄을 파일에 추가합니다. 그렇지 않으면 ed파일이 그 자리에서 편집됩니다.


SMEAR다음과 같은 변수에 값을 저장 하면

var=-7

다음을 실행합니다.

sed '/SMEAR/{h;s/.*/SMEAR='"$var"'/};${x;/^$/{s//SMEAR='"$var"'/;H};x}' infile

또는

ed -s infile<<IN || printf %s\\n "SMEAR=${var}" >> infile
/SMEAR.*/s//SMEAR=${var}/ 
w
q
IN

답변3

또는 구현와일드카드 아이디어 (포함된 모든 기존 행을 삭제 SMEAR하고 원하는 행을 삽입합니다.) 석기 시대 도구 사용:

(grep -v '^SMEAR=' file1; echo 'SMEAR=-5') > file1.tmp  &&  cp file1.tmp file1  &&  rm file1.tmp

또는 보존된 속성(예: 권한) 및 하드 링크에 관심이 없다면 file1다음을 수행할 수 있습니다.

(grep -v '^SMEAR=' file1; echo 'SMEAR=-5') > file1.tmp  &&  mv file1.tmp file1

아니면 가 있으면 sponge이렇게 할 수 있습니다.

(grep -v '^SMEAR=' file1; echo 'SMEAR=-5') | sponge file1

관련 정보