![awk 中的相对行偏移量(/pattern/+1 或 /pattern/-1)](https://linux22.com/image/18302/awk%20%E4%B8%AD%E7%9A%84%E7%9B%B8%E5%AF%B9%E8%A1%8C%E5%81%8F%E7%A7%BB%E9%87%8F%EF%BC%88%2Fpattern%2F%2B1%20%E6%88%96%20%2Fpattern%2F-1%EF%BC%89.png)
当我想打印两个图案之间的线条(不包括具有这些图案的线条)时,我可以在ex
使用图案后进行+1
打印。-1
太棒了。这可能吗awk
?现在,我通过设置一个is_printing
标志来拼凑它。
这是ex
为了从 SQL 表创建中获取列定义:
$ ex schema/media.sql <<< '/^CREATE TABLE/+1,/^)/-1p'
# id
# SMALLINT
# UNSIGNED
# NOT NULL
# AUTO_INCREMENT
# COMMENT 'The auto-generated ID.',
# parent_id
# SMALLINT
# UNSIGNED
# NULL
# COMMENT 'The ID of the parent album, if any.',
# title
# VARCHAR(255)
# COLLATE utf8_unicode_ci
# NOT NULL
# DEFAULT ''
# COMMENT 'The album title.',
# description
# TEXT
# COLLATE utf8_unicode_ci
# NOT NULL
# COMMENT 'The album''s description.',
这是awk
执行相同操作的命令:
$ awk '/^\)/ { exit; } is_printing; /^CREATE TABLE/ { is_printing = 1; }' schema/media.sql
我发现 awk 版本不那么可读。我缺少一个成语吗?sed
这样的事也能做吗? (与s相比,我更喜欢awk
s 语法。)sed
答案1
抱歉,但 awk 不能这样做,因为每一行都是单独通过脚本传递的。
理论上可以实现+x,之后转动一条线匹配X更多输入行为 true,但我认为我不想调试此类脚本;-)
顺便说一句:虽然所有内容都可以放在同一行上,但我至少会为每个条件/操作对投票支持一个新行,因此脚本更容易阅读和理解。