비교적 자주 업데이트하고 싶은 파일이 있습니다.
해야 할 일은 더 많은 줄을 포함하도록 파일의 특정 부분을 변경하는 것입니다. 이 작업을 수행하기 위해 sed
및 옵션을 사용하고 있습니다 . 따라서 다음과 같이 작동합니다. \a
sed -i "/import:/a\$IMPORTED" file
처음에는 예상대로 작동합니다. 다음에 재실행할 때 이 명령은 동일한 줄을 계속해서 추가합니다.
다시 실행하기 전에 가져온 모든 항목을 삭제하려면 어떻게 해야 합니까?
예를 들어, 다음 줄 중 일부를 사용하여 시작 부분에 고정합니다. 자동으로 추가되지는 않습니다.
답변1
당신의 명령:
sed "/import:/a\$IMPORTED" infile
$IMPORTED
Linux 및 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' 파일
코너 문제가 있습니다. 변수에 $old
null 값(비어 있음)이 포함되어 있으면 줄 바꿈이 제거됩니다. 이 문제를 해결하려면 다음이 필요합니다.
sed -E -e 'H;1h;$!d;x' -e 's/(import:)'"${old:+"(\\n)$old"}"'/\1/g' -e 's/(import:)/\1\n'"$new"'/g' infile