如果文件中尚不存在两行文本,我会将其添加到文件中。这些行可以位于该文件中的不同位置。所以常规补丁不会起作用。是否可以有一个简化的补丁,仅包含要添加的行:
> 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
更新配置文件时会出现问题。例如,您可以将其作为 shell 脚本函数来执行:
#!/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
且不以空行结尾。