我需要使用由,
和/或\r\n
或\n
组成的分隔符转换ID列表,并使用,|
。 (主要是:s/[,\r\n]+/,\|/g
没有尾随|
)
示例输入数据:
123,456,789,012
或
123,
456
789,
012
我需要结果输出为123,|456,|798,|012,
:一个逗号结束每个字段,一个管道将它们分开。
这看起来很简单,但我对如何管理这件事感到非常难过。实际上,我已经尝试了很多方法,但似乎没有任何效果。以下是一些例子:
sed "s/[,\r\n]+/,\|/g" < filename
与任何分隔符都不匹配。
sed "s/(,|,?\r?\n?)/,\|/g"
也不匹配任何内容。
tr -t "(,?(\r|\n)+)" ",\|"
和tr -t "[,\r\n]+" ",\|"
仅替换,
tr "(,|\r?\n)" ",\|"
可与,
一起使用,但,\n
和,\r\n
会将匹配的字符替换为多个条形。例如:123|||456|||789|||012|
变得更复杂:sed ':a;N;$!ba;s/\n/,/g"
(取自here)使用\n
正确替换,
,但不能与\r\n
一起使用。用\n
替换[,\r\n]
只会返回输入。
我很难过。有人可以提供一些帮助或建议吗?
答案 0 :(得分:3)
从您的示例输出中,似乎输出端没有管道;你有,
标记每个字段的结尾,|
分隔字段对。对于该规范,这适用于tr
和sed
:
$ 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;'
此外,您希望在最后一个字段之后进行尾随。