如何在逗号分隔的括号数据中插入换行符?

How to insert line breaks into comma-separated parenthetical data?

我在文本文件中有一组数据,如下所示:

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

我希望那些带括号的部分在他们自己的行上,保留它们之间的逗号:

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

我尝试了很多 sedtr 以及 awk 的组合,但是其中 none 产生了我想要的结果。他们将数据留在一行并添加了 r 或 n,或者他们在下一行吃掉第一个左括号,或者他们有其他解析问题。

这终于在我的本地计算机上运行了 (Linux):

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

但它在我需要它工作的远程服务器 (FreeBSD) 上失败了。我还没有找到任何适用于 FreeBSD 的东西。

我已经在这里待了几个小时了。任何帮助都将不胜感激。谢谢!

虽然您不能(轻易地)在 sed 的替换模式中使用“\n”转义序列,但您可以通过在行尾使用反斜杠来放置一个实际的换行符。

来自标准输入

# 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 测试了这个。

试试这个:

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

注意 $'' ,这将有助于用真正的换行符替换 \n ,通过执行以下操作进行测试:

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

您将需要 sh,如果您在 FreeBSD 中使用默认的 csh shell,将无法工作。

如果您无法更改 shell 而只有 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)