diff line-format:显示删除,新增和更改的行?

时间:2016-08-02 17:14:29

标签: linux shell

为Backup.txt

final

" main.txt"与" backup.txt"相同。如果我重命名" user1",请添加新用户,然后删除" user2"在" main.txt"。 " main.txt"好像是:

user1:password:17002:0:99:7:::
user2:password:17003:0:99:7:::
user3:password:17004:0:99:7:::

之后我使用以下命令比较两个文件:

username1:password:17002:0:99:7:::
user3:password:17004:0:99:7:::
newUser:password:17005:0:99:7:::

...实际输出:

diff --unchanged-line-format="" --old-line-format=":%dn: %L" --new-line-format=":%dn: %L" backup.txt main.txt

但是,我的预期输出是:

:1: user1:password:17002:0:99:7:::
:2: user2:password:17003:0:99:7:::
:1: username1:password:17002:0:99:7:::
:3: newUser:password:17005:0:99:7:::
像这样。默认情况下启用这些字符" diff"命令使用。如何为行格式启用这些字符。有可能吗?

1 个答案:

答案 0 :(得分:1)

BSD和GNU差异提供的LTYPE是" old"," new"和"未更改"。因此,您无法区分" new"并且"改变了#34;。

也就是说,要在格式字符串中获得某些区别,您需要正确填写它们。在%dn中,dn都被消耗(前者指定了十进制值,n指定它引用行号或者数量修改的行,取决于上下文)。因此,如果您需要任何额外字符(例如cda),则需要在替换完成后添加这些字符。

# declaring functions to allow testing without creating files on-disk
backup () { printf '%s\n' user1:password:17002:0:99:7::: user2:password:17002:0:99:7::: user3:password:17002:0:99:7:::; }
main () { printf '%s\n' username1:password:17002:0:99:7::: user3:password:17004:0:99:7::: newUser:password:17005:0:99:7:::; }

diff \
  --unchanged-line-format=":%dnu: %L" \
  --old-line-format=":%dnd: %L" \
  --new-line-format=":%dnn: %L" \
  <(backup) <(main)