두 줄의 텍스트가 아직 없으면 파일에 추가하겠습니다. 이 줄은 파일의 다른 위치에 있을 수 있습니다. 따라서 일반 패치는 작동하지 않습니다. 추가할 줄만 포함하는 단순화된 패치를 만드는 것이 가능합니까?
> Line 1
> Line 2
? 이것은 더 이상 일반적인 패치처럼 느껴지지 않습니다. 다른 소프트웨어가 필요한 것 같은데요 patch
?
답변1
패치가 작동하는 방식은 그렇지 않습니다. 이 유틸리티는 patch
두 가지 기존 버전의 파일 또는 파일 세트에서 실행되는 유틸리티로 작성된 패치를 적용합니다. diff
두 버전 모두 정적이며 패치를 적용하면 한 버전이 다른 버전으로 변환됩니다(양방향 모두 가능).
lines.in
다른 파일( )에서 완전히 누락된 파일( )의 줄만 추가하려면 다음과 같이 ( 및 )를 file.dat
사용할 수 있습니다 .comm
bash
ksh93
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
-v
file.dat
-f file.dat
file.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
않고 빈 줄로 끝나지 않는다고 가정합니다.