![使用 grep/awk 解析 diff 文件](https://linux22.com/image/558175/%E4%BD%BF%E7%94%A8%20grep%2Fawk%20%E8%A7%A3%E6%9E%90%20diff%20%E6%96%87%E4%BB%B6.png)
我正在尝试解析一些 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风格,awk
grep
不支持负向前瞻。您应该尝试使用 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