이는 아키텍처 문제에 더 가깝습니다.
sed 파일에서 일부 대체/추가를 수행하는 스크립트가 있습니다. 예를 들면 다음과 같습니다.
sed -i 's/MY_VAR = 1000/MY_VAR = 1000\nMY_VAR2 = 500/' file.txt
잘 작동하지만 다소 큰 스크립트의 일부이므로 누군가가 ^C
처음에 스크립트를 실행하고 다시 실행하거나 N번 연속해서 다시 실행하면 비슷한 결과가 나올 수 있습니다.
MY_VAR = 1000
MY_VAR2 = 500
MY_VAR2 = 500
MY_VAR2 = 500
MY_VAR2 = 500
...
이는 예상치 못한 일일 수 있습니다. 그래서 내 질문은: 이것을 피하는 가장 좋은 방법은 무엇입니까? 나는 다음과 같은 것을 생각해 냈습니다.
if [ ! -f file.txt~copy ]
then
cp file.txt file.txt~copy
sed -i 's/MY_VAR = 1000/MY_VAR = 1000\nMY_VAR2 = 500/' file.txt
fi
어느 것이 잘 작동해야 하지만 이를 달성하기 위한 더 나은/권장 방법이 있는지 궁금합니다. 파일이 매우 크고 touch
보호를 위해 파일을 복사 하려는 경우 위의 내용은 분명히 문제가 될 수 있습니다.
답변1
이는 쉽게 확장할 수 없으므로 실제 사용 사례에 적합할 수도 있고 그렇지 않을 수도 있지만 추가하려는 행이 이미 존재하는지 확인하고 존재하지 않는 경우에만 추가할 수 있습니다.
sed '
/^MY_VAR = 1000$/ {
$ b a
N
/\nMY_VAR2 = 500$/! s/\n/&MY_VAR2 = 500\
/
b
:a a \
MY_VAR2 = 500
}'
MY_VAR = 1000
여기에서 정확한 줄을 찾으면 다음과 같습니다.
$
마지막 ( ) 줄인 경우 레이블을b
찾아 출력 끝에 추가합니다 .a
a
MY_VAR2 = 500
N
추가된 ext 라인 뒤의 패턴 공간이!
( ) 뒤의 개행 문자로 끝나지 않으면, 포함된 개행 문자는 개행 문자 + + 개행 문자MY_VAR2 = 500
로 대체됩니다 . 그런 다음 스크립트 실행을 피하기 위해 스크립트 끝까지 실행합니다. 명령도 추가하세요) ;MY_VAR2 = 500
b
그렇지 않으면 우리는 아무것도 하지 않습니다.