У меня есть файл, полный текста, например:
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
Для любой строки, котораясодержит«ДВИГАТЕЛЬ», удалить запятую в конце строки.
решение2
Решение awk
/^) ENGINE/ {
sub( /,$/, "" )
print
next
}
{
print
}