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
간단히 다음을 사용합니다.
SMEAR
다음의 모든 인스턴스를 삭제합니다 .- 원하는 행을 삽입하세요.
다음을 수행할 수 있습니다.
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