使用 grep/awk 解析 diff 文件

使用 grep/awk 解析 diff 文件

我正在尝试解析一些 sql 文件的标准 diff 以仅返回删除部分。我一直在使用带有 after context (-A) 的 grep,这几乎有效(只是因为我知道删除部分都非常短)。例如

diff $$_$1.sql $$_$2.sql|egrep -A3 "[01234567889][01234567889]d[01234567889][0123456789]"

我认为使用 AWK,我可以告诉它从(上面的正则表达式)开始,并停在以数字开头的第一行或以 -- 结尾的第一行。

我尝试了一下,但似乎找不到正确的语法来执行此操作。可以使用 AWK 完成此操作吗?或者我应该使用其他工具吗?

答案1

我认为使用 AWK,我可以告诉它从(上面的正则表达式)开始,并停在以数字开头的第一行或以 -- 结尾的第一行。

如果这不是您想要的,请给我们一个例子:

sed -n '/[0-9][0-9]d[0-9][0-9]/,/^[0-9]\|--$/p'

编辑

虽然你已经接受了我的回答,但我仍然想编辑我的帖子,与你分享一个可以帮助你彻底解决问题的正则表达式。sed允许你排除匹配的行使用b-branch命令:

sed -n '/[0-9][0-9]d[0-9][0-9]/,/^[0-9]\|--$/ { /^[0-9]/b; p }'

但使用此正则表达式,sed还要删除 REGEX1。因此,展望在我的脑海里浮现:

sed -n '/[0-9][0-9]d[0-9][0-9]/,/^[0-9]\|--$/ { /^[0-9](?:(?![0-9]d[0-9][0-9]).*)$/b; p }'

但它不起作用,因为,,sed使用POSIX RE风格,awkgrep不支持负向前瞻。您应该尝试使用 Python、Perl、Ruby……

答案2

我倾向于尝试使用统一差异和简单的 grep 来做到这一点:

diff -u a.sql b.sql | grep -v '^\+' | rediff

在您弄乱差异之后,将rediff尝试修复偏移量......它不会在所有情况下都起作用,但这是您保持有效差异的最佳希望。

答案3

diff ... | awk '/start-mark/ {flag = 1} /end-mark/ {flag = 0} flag'

您的正则表达式可能可以简化为[0-9](等等)

如果您只想打印第一个匹配的行范围,则可以将其flag = 0更改为。exit

相关内容