Замените "), (" на " ),\n (" в Linux

Однозначно записывать каждую новую команду сложно. Сначала нужно добавить в ~/.profileили аналогичный:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Затем нужно добавить к~/.bash_logout:

history -a
history -w
1
17.12.2020, 18:16
1 ответ

Проблема на самом деле не в том, что со скобками проблематично работать, а в том, что иногда трудно вставить новую строку в текст.

Использование 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вы можете вставлять новую строку после запятой в каждое вхождение ),(в строке с помощью команды

g/INSERT INTO/ s/),(/),\
(/g

(Этот последний \в первой строке экранирует символ новой строки.)

Это применяет команду s///gко всем строкам, содержащим строку INSERT INTO, и вставляет литеральную новую строку после каждой запятой между двумя скобками.

Вы можете сделать что-то подобное со стандартным sed. Из командной строки:

sed '/INSERT INTO/ s/),(/),\
(/g'
6
18.03.2021, 22:42

Теги

Похожие вопросы