중복된 sed 대체 보호

중복된 sed 대체 보호

이는 아키텍처 문제에 더 가깝습니다.

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찾아 출력 끝에 추가합니다 .aaMY_VAR2 = 500

  • N추가된 ext 라인 뒤의 패턴 공간이 !( ) 뒤의 개행 문자로 끝나지 않으면, 포함된 개행 문자는 개행 문자 + + 개행 문자 MY_VAR2 = 500로 대체됩니다 . 그런 다음 스크립트 실행을 피하기 위해 스크립트 끝까지 실행합니다. 명령도 추가하세요) ;MY_VAR2 = 500b

  • 그렇지 않으면 우리는 아무것도 하지 않습니다.

관련 정보