동일한 내용을 반복해서 다시 삽입하지 않고 파일 중간에 새 텍스트를 삽입하여 이전 텍스트를 바꾸시겠습니까?

동일한 내용을 반복해서 다시 삽입하지 않고 파일 중간에 새 텍스트를 삽입하여 이전 텍스트를 바꾸시겠습니까?

비교적 자주 업데이트하고 싶은 파일이 있습니다.
해야 할 일은 더 많은 줄을 포함하도록 파일의 특정 부분을 변경하는 것입니다. 이 작업을 수행하기 위해 sed및 옵션을 사용하고 있습니다 . 따라서 다음과 같이 작동합니다. \a

sed -i "/import:/a\$IMPORTED" file  

처음에는 예상대로 작동합니다. 다음에 재실행할 때 이 명령은 동일한 줄을 계속해서 추가합니다.
다시 실행하기 전에 가져온 모든 항목을 삭제하려면 어떻게 해야 합니까?
예를 들어, 다음 줄 중 일부를 사용하여 시작 부분에 고정합니다. 자동으로 추가되지는 않습니다.

답변1

당신의 명령:

sed "/import:/a\$IMPORTED" infile

$IMPORTEDLinux 및 GNU sed에 텍스트 삽입 문제는 쉘이 앞의 백슬래시를 해석하고 있다는 것입니다 $. 올바르게 인용할 수 있습니다.

sed '/import:/a\'"$IMPORTED" infile

또는 값을 자체 스크립트 섹션으로 분할합니다.

sed -e '/import:/a\' -e "$IMPORTED" infile

sed 스크립트의 작은따옴표는 항상 더 좋습니다.

도착하다바꾸다old에는 new정의되지 않은 수의 행이 포함될 수 있습니다.

  • 첫째: 패턴 공간의 모든 라인을 캡처합니다.

    sed 'H;1h;$!d;x' 파일

  • 변경할 값을 설정합니다.

    old='원래' new='새 값'

  • 이전 값 삭제(존재해야 함):

    sed -E -e 'H;1h;$!d;x' -e 's/(import:)(\n)'"$old"'/\1/g' 파일

  • 새 입력을 추가합니다.

    sed -E -e 'H;1h;$!d;x' -e 's/(가져오기:)(\n)'"$old"'/\1/g' -e 's/(가져오기:) /\1\n'"$new"'/g' 파일

코너 문제가 있습니다. 변수에 $oldnull 값(비어 있음)이 포함되어 있으면 줄 바꿈이 제거됩니다. 이 문제를 해결하려면 다음이 필요합니다.

sed -E -e 'H;1h;$!d;x' -e 's/(import:)'"${old:+"(\\n)$old"}"'/\1/g' -e 's/(import:)/\1\n'"$new"'/g' infile

관련 정보