Как вставить разрывы строк в разделенные запятыми данные? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть набор данных в текстовом файле, который выглядит следующим образом:

(1,2,3),(A,B,C),(4,5,6)

Я хочу, чтобы эти сегменты в скобках были в своих собственных строках, сохраняя запятые между ними:

(1,2,3),
(A,B,C),
(4,5,6)

Я пробовал много комбинаций sed и tr и awk, но ни одна из них не дала желаемого результата.Они оставляют данные в одной строке с добавленными r или n, или используют первую открытую скобку в следующей строке, или у них возникают другие проблемы с синтаксическим анализом.

Это наконец-то сработало на моем локальном компьютере (Linux):

sed -r 's/\),\(+/\),\r\(/g' file > file

Но это не удалось на удаленном сервере, где он мне нужен (FreeBSD).Я еще не нашел ничего, что работает во FreeBSD.

Я занимаюсь этим часами.Любая помощь вообще будет оценена.Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Дайте попытку этому:

$ echo '(1,2,3),(A,B,C),(4,5,6)' | sed -e $'s/),/),\\\n/g'

Обратите внимание на $'', это поможет заменить \n реальным переводом строки, протестируйте, выполнив:

$ echo $'s/),/),\\\n/g'
s/),/),\
/g

Вам понадобится sh, не будет работать, если вы используете оболочку csh по умолчанию во FreeBSD.

Если вы не можете изменить оболочку и имеете только csh, это работает:

$ echo '(1,2,3),(A,B,C),(4,5,6)' | perl -pe 's/\),/\),\n/g'

Обе опции выведут:

(1,2,3),
(A,B,C),
(4,5,6)
0 голосов
/ 01 июня 2018

Хотя вы не можете (легко) использовать escape-последовательность '\ n' в шаблоне замены с помощью sed, вы можете поместить фактическую новую строку, используя обратную косую черту в конце строки.

From stdin

# echo '(1,2,3),(A,B,C),(4,5,6)' | sed -e 's/),/),\
/g'
(1,2,3),
(A,B,C),
(4,5,6)

Из файла

# sed -e 's/),/),\
/g' infile

Я проверял это с FreeBSD 11.2 и Arch Linux.

...