sed - 替换后面跟不是5位数的换行符

时间:2014-07-29 13:00:18

标签: regex bash sed

我有一个带有一些(脏)数据库架构的csv文件。

示例:

10391,0,3,4,12,44 --ok
10391,0,3,4,      --not ok
12,44             --not ok
10391,0,3,4,12,44 --ok

我想编写sed脚本来替换带有空格的新行字符(后面跟不是5位数字)。

写了这个,但对我来说不正常:

sed 's/\n\([0-9]{1,4}\)/ \1/g' 

在此示例上运行

11111 sss
22222 aaa
3333 aaa
333 sss
22 sss
1 sss

应该产生

11111 sss
22222 aaa 3333 aaa 333 sss 22 sss 1 sss

感谢任何能够提供帮助的人

3 个答案:

答案 0 :(得分:6)

或使用Perl One-Liner

perl -0777 -pe 's/\n(?!\d{5}\b)/ /g' yourfile

<强>解释

  • \n与换行符匹配
  • (?!\d{5}\b)断言后面的内容不是五位数字和一个单词边界
  • 我们插入一个空格

答案 1 :(得分:0)

使用awk

awk -v ORS= 'NR > 1 { printf /^[0-9]{5} / ? "\n" : " " } 1
    END { if (NR) printf "\n" }' file

输出:

11111 sss
22222 aaa 3333 aaa 333 sss 22 sss 1 sss

答案 2 :(得分:0)

awk '{printf "%s%s" ,(NR>1&&$0~/^[0-9]{5} /?"\n":" "),$0}END{print ""}'

应该适用于您的示例:

kent$  echo "11111 sss
22222 aaa
3333 aaa
333 sss
22 sss
1 sss"|awk '{printf "%s%s" ,(NR>1&&$0~/^[0-9]{5} /?"\n":" "),$0}END{print ""}'
11111 sss
22222 aaa 3333 aaa 333 sss 22 sss 1 sss