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

したがって、例では、最後から 2 番目の行の末尾のカンマを何もない行に置き換えたい、またはより一般的には、ある式に一致する行の前の最後の行の末尾にある部分文字列を単に置き換えたいと考えています。 を使用した失敗した試みではsed、行末を表すために を使用しました$が、sed は行末をまたがってではなく 1 行ずつ読み取るため、この方法ではうまくいかないことはすでにわかっていました。しかし、この例は私が実現したいことを示しているため、 では実現できない可能性がありますsed

答え1

いかがでしょうか

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

どのラインでも含む「ENGINE」、行末のカンマを削除します。

答え2

awkソリューション

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

  {
    print
  }

関連情報