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
  }

相關內容