使用sed或tr替换不同的分隔符

时间:2013-05-30 02:19:44

标签: sed newline tr

我需要使用由,和/或\r\n\n组成的分隔符转换ID列表,并使用,|。 (主要是: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\n会将匹配的字符替换为多个条形。例如:123|||456|||789|||012|

  5. 变得更复杂:sed ':a;N;$!ba;s/\n/,/g"(取自here)使用\n正确替换,,但不能与\r\n一起使用。用\n替换[,\r\n]只会返回输入。

  6. 我很难过。有人可以提供一些帮助或建议吗?

2 个答案:

答案 0 :(得分:3)

从您的示例输出中,似乎输出端没有管道;你有,标记每个字段的结尾,|分隔字段对。对于该规范,这适用于trsed

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

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

答案 1 :(得分: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;'

此外,您希望在最后一个字段之后进行尾随。