4

我需要将 ID 列表从使用由,和/或\r\n组成的分隔符转换\n为使用,|. (本质上:s/[,\r\n]+/,\|/g没有尾随|

示例输入数据:

123,456,789,012

或者

123,
456
789,
012

我需要得到的输出是123,|456,|798,|012,:一个逗号结束每个字段,以及一个分隔它们的管道。

这看起来很简单,但我对如何管理这个问题感到很困惑。我已经尝试过......实际上有很多方法,但似乎没有任何效果。这里有一些例子:

  1. sed "s/[,\r\n]+/,\|/g" < filename不匹配任何分隔符。

  2. sed "s/(,|,?\r?\n?)/,\|/g"也不匹配任何东西。

  3. tr -t "(,?(\r|\n)+)" ",\|"并且tr -t "[,\r\n]+" ",\|"只替换,

  4. tr "(,|\r?\n)" ",\|"可以正常工作,但,可以用多个条替换匹配的字符。前任:,\n,\r\n123|||456|||789|||012|

  5. 变得更复杂:(sed ':a;N;$!ba;s/\n/,/g"取自此处\n正确替换为,但不适用于\r\n. \n用替换[,\r\n]只是返回输入。

我难住了。任何人都可以提供一些帮助或建议吗?

4

2 回答 2

3

从您的示例输出来看,输出似乎最后没有管道;您已,标记每个字段的结尾,并|分隔成对的字段。对于该规范,这适用于trand sed

$ x="123,
> 456
> 789,
> 012"
$ echo "$x" | tr -s '\r\n' ',' | sed 's/,\(.\)/,|\1/g'
123,|456,|789,|012,
$

tr命令用逗号替换换行符和回车符,挤压 ( -s) 重复项。该sed命令查找后跟另一个字符的逗号并将其替换为,|.

于 2013-05-30T02:30:57.870 回答
0

我所做的是将 \r\n 序列标准化为 \n 以摆脱一个替代方案(并提高下一步的速度)。

perl -pi -e 'BEGIN { $/ = undef; } s/\r\n/\n/g; s/[,\n]/,|/g;'

更新:从您的示例中,您似乎打算用一次出现的 ,| 替换多次出现的分隔符,它们之间没有任何内容。如果这是您想要做的,那么将命令更改为:

perl -pi -e 'BEGIN { $/ = undef; } END { print ",\n"; } s/\r\n/\n/g; s/[,\n]+/,|/g;'

此外,您需要一个尾随 , 在最后一个字段之后。

于 2013-05-30T02:25:18.837 回答