awk 解决方案

awk 解决方案

我有一个充满文本的文件,例如:

CREATE TABLE `wild_adventure_game` (
  `game_instance_id` bigint(20) unsigned NOT NULL,
  `free_game_config_id` bigint(20) unsigned DEFAULT NULL,
  `respin_instance_id` bigint(20) DEFAULT NULL,
  `state` varchar(20) NOT NULL,
  `stake` decimal(11,2) NOT NULL,
  `pay_line_win` decimal(11,2) NOT NULL,
  `bonus_win` decimal(11,2) NOT NULL,
  `total_win` decimal(11,2) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1

有时包含 的行末尾会有逗号ENGINE,有时没有。我想替换(即删除)那个逗号 - 我第一次天真的尝试是这样的:

sed -e 's/'$) ENGINE/$) ENGINE/' < the_file

当然,这行不通,但是否有可能sed通过某种方式来实现呢?或者,如果没有,也许可以awk?在最坏的情况下,我可以编写一个 bash 脚本,但那会很笨拙。

编辑

我发现上面的拼写错误了 - 应该是:

sed -e 's/,$) ENGINE/$) ENGINE/' < the_file

因此,在示例中,我想将倒数第二行末尾的逗号替换为空,或者更一般地,只是替换与某个表达式匹配的行之前最后一行末尾的某个子字符串。在我使用 的失败尝试中sed,我使用$来表示行尾,而且我似乎已经知道它无法工作,因为 sed 逐行读取,而不是跨行读取;但它说明了我想要实现的目标 - 而使用 可能无法实现sed

答案1

怎么样

sed '/ENGINE/ s/,$//' file

对于任何一条线包含“ENGINE”,删除行末的逗号。

答案2

awk 解决方案

  /^) ENGINE/ {
    sub( /,$/, "" )
    print
    next
  }

  {
    print
  }

相关内容