需要解释一下Sed命令

时间:2016-11-27 16:37:38

标签: regex sed

我有一个包含一行中所有记录的平面文件,因为文件中没有换行符。例如: 姓名,年龄,乐队,地址,姓名,年龄,乐队,地址,姓名,年龄,乐队,地址 理想情况下,它们应该是3条记录,但它们都被我的ETL工具读作单个记录。我在网站上发现了一些与我的问题类似的问题并得到了解决方案:

sed 's/\([^,]*,[^,]*\),/\1\n/g'1)

我还没有尝试过但是,我会在 sed' s / 之后不理解任何事情。有人可以在' s / 之后了解每个角色。

并且如果有人有任何其他解决方案来获取这一长列的列,这些列被读作单个记录被分割成行。

谢谢,

Rajni

2 个答案:

答案 0 :(得分:1)

假设您的文件名为input.txt,您可以尝试以下内容:

xargs -a input.txt -n4 -d"," printf "%s,%s,%s,%s\n"

答案 1 :(得分:0)

假设问题中的尾随1)是拼写错误,

sed 's/\([^,]*,[^,]*\),/\1\n/g'

将用换行符替换每一秒逗号(如果你有替换字符串中的\n的sed;并非所有实现都这样做)。 \(\)分别开始和结束一个组。 [^,]*匹配最长的非逗号字符串,,匹配单个逗号。 /是一个分隔符,因此s命令全局替换模式中所有出现的模式(两个字符串用逗号分隔)和换行符。

这显然不是你想要的。要用换行替换每一行的第四个逗号,你可以(使用gnu sed):

sed -n ':a; s/,/\n/4; t b; :b; {P; D}; b a;'

有更好的方法(例如,perl)可以做到这一点,但由于问题的目的似乎是了解sed而不是实际过滤数据,这是一个有趣的解决方案。