줄번호를 포함하지 않는 패치, 가능할까요?

줄번호를 포함하지 않는 패치, 가능할까요?

두 줄의 텍스트가 아직 없으면 파일에 추가하겠습니다. 이 줄은 파일의 다른 위치에 있을 수 있습니다. 따라서 일반 패치는 작동하지 않습니다. 추가할 줄만 포함하는 단순화된 패치를 만드는 것이 가능합니까?

> Line 1
> Line 2

? 이것은 더 이상 일반적인 패치처럼 느껴지지 않습니다. 다른 소프트웨어가 필요한 것 같은데요 patch?

답변1

패치가 작동하는 방식은 그렇지 않습니다. 이 유틸리티는 patch두 가지 기존 버전의 파일 또는 파일 세트에서 실행되는 유틸리티로 작성된 패치를 적용합니다. diff두 버전 모두 정적이며 패치를 적용하면 한 버전이 다른 버전으로 변환됩니다(양방향 모두 가능).

lines.in다른 파일( )에서 완전히 누락된 파일( )의 줄만 추가하려면 다음과 같이 ( 및 )를 file.dat사용할 수 있습니다 .commbashksh93

comm -23 <( sort lines.in ) <( sort file.dat ) >>file.dat

추가된 행이 정렬됩니다.

다음 라인 순서를 유지하는 솔루션 lines.in:

grep -v -x -F -f file.dat lines.in >>file.dat

이는 ()에 존재 하지 않는 ( )의 모든 행을 grep찾아서 추가하는 데 사용됩니다 . 완전한 행은 고정 문자열( )로 비교됩니다.lines.in-vfile.dat-f file.datfile.dat-x -F

답변2

구성 파일을 업데이트할 때 문제가 발생합니다. 예를 들어, 이를 쉘 스크립트 함수로 실행할 수 있습니다:

#!/bin/sh
add_data() {
    grep "^$2$" "$1" >/dev/null 2>/dev/null || echo "$2" >>"$1"
}

add_data program.conf "Line 1"
add_data program.conf "Line 2"

이 예에서는 추가 텍스트가 없는 줄만 일치하도록 표현식을 고정했습니다. 그러나 데이터에 메타문자가 없다고 가정합니다. 이 호출은 리터럴 텍스트를 추가하지 않습니다.

add_data program.conf ".*Line 2$"

grep에서 문제를 일으킬 수 있는 문자를 이스케이프 처리하여 이 문제를 해결할 수 있습니다.

논평자들은 이 문제가 다음을 통해 해결될 수 있다고 지적했습니다.저것사용 문제POSIX옵션-x:

종결자를 제외한 줄의 모든 문자를 사용하여 전체 고정 문자열 또는 정규식과 일치하는 입력 줄만 일치하는 줄로 간주됩니다.

결과는 다음과 같습니다.

#!/bin/sh
add_data() {
    grep -F -x "$2" "$1" >/dev/null 2>/dev/null || echo "$2" >>"$1"
}

add_data program.conf "Line 1"
add_data program.conf "Line 2"
add_data program.conf ".*Line 2$"

답변3

다음과 같이 파일에 다음 줄을 추가하면:

Line 1
Line 2

다음을 수행할 수 있습니다.

pcregrep -xqM "\Q$(cat that-file)\E" file-to-patch ||
  cat that-file >> file-to-path

이는 빈 줄 that-file을 포함하지 \E않고 빈 줄로 끝나지 않는다고 가정합니다.

관련 정보