行番号を含まないパッチ、可能でしょうか?

行番号を含まないパッチ、可能でしょうか?

2行のテキストがまだない場合は、ファイルに追加します。この行はファイル内の他の場所にある可能性があります。したがって、通常のパッチは機能しません。追加する行だけを含む単純化されたパッチを作成することは可能ですか?

> Line 1
> Line 2

?これはもはや一般的なパッチのようには感じません。他のソフトウェアが必要だと思いますかpatch

答え1

パッチの動作方法はそうではありません。このユーティリティは、patch2 つの既存バージョンのファイルまたはファイルセットで実行されるユーティリティで作成されたパッチを適用します。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空行で終わらないと仮定します。

関連情報