Однозначно записывать каждую новую команду сложно. Сначала нужно добавить в ~/.profile
или аналогичный:
HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'
Затем нужно добавить к~/.bash_logout
:
history -a
history -w
Проблема на самом деле не в том, что со скобками проблематично работать, а в том, что иногда трудно вставить новую строку в текст.
Использование GNU sed
(, обычно встречающееся в системах Linux ):Это просто заменяет все вхождения строки ),(
на ),\n(
(, где \n
— буквальный перевод строки ). GNU sed
может вставлять символы новой строки, закодированные как \n
, с s///
вот так.
$ sed 's/),(/),\n(/g' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);
Использование стандартаsed
:Это первое «отмечает», где должны идти новые строки, вставляя какой-либо другой символ (@
, используемый здесь, выберите тот, который не встречается в данных ). Затем они заменяются новыми строками с использованием y///
(, который действительно понимает \n
как новые строки в не -GNUsed
).
$ sed 's/),(/),@(/g; y/@/\n/' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);
Вышеупомянутое также могло быть записано как sed 's/),(/),@(/g' file | tr '@' '\n'
.
Использование стандарта sed
, но кодирование новой строки как \n
, а затем получение оболочки для вставки буквальной новой строки на ее место с использованием «строки C -» ($'...'
, доступной в некоторых оболочках):
$ sed $'s/),(/),\\\n(/g' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);
См. самый конец для "полностью стандартного" варианта выше.
Использованиеawk
:Это переформатирует заданные данные из записи с полями, разделенными ),(
, в запись с полями, разделенными ),\n(
, а затем выводит переформатированные данные.
$ awk -F '[)],[(]' -v OFS='),\n(' '{ $1 = $1; print }' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);
Шаблон, используемый в качестве разделителя поля ввода, [)],[(]
, также может быть записан как \\),\\(
. Вам нужна двойная обратная косая черта, чтобы избежать обратной косой черты, которая экранирует круглые скобки. Вам действительно нужно это только перед (
, но я использую его перед обоими для симметрии (, и это ничего не сломает; \)
в любом случае соответствует )
). Если вам не нравится симметрия, используйте либо ),[(]
, либо ),\\(
.
Здесь нам пришлось рассматривать (
специально, так как awk
использует расширенные регулярные выражения (, а не базовые , которые sed
используют по умолчанию ).
Для полноты, так как вопрос помечен ed ...
С помощью редактора ed
вы можете вставлять новую строку после запятой в каждое вхождение ),(
в строке с помощью команды
g/INSERT INTO/ s/),(/),\
(/g
(Этот последний \
в первой строке экранирует символ новой строки.)
Это применяет команду s///g
ко всем строкам, содержащим строку INSERT INTO
, и вставляет литеральную новую строку после каждой запятой между двумя скобками.
Вы можете сделать что-то подобное со стандартным sed
. Из командной строки:
sed '/INSERT INTO/ s/),(/),\
(/g'