如果行没有以KEYWORD开头,则删除换行符

时间:2012-11-27 12:19:47

标签: ruby regex powershell sed awk

我有一个平面文件,其中的行看起来像

KEYWORD|DATA STRING HERE|32|50135|ANOTHER DATA STRING
KEYWORD|STRING OF DATA|1333|552555666|ANOTHER STRING
KEYWORD|STRING OF MORE DATA|4522452|5345245245|REALLY REALLY REALLY REALLY
LONGSTRING THAT INSERTED A LINE BREAK WHEN I WAS EXTRACTING FROM SQLPLUS/ORACLE
KEYWORD|.....

如何删除换行符

KEYWORD|STRING OF MORE DATA|4522452|5345245245|REALLY REALLY REALLY REALLY
LONGSTRING THAT INSERTED A LINE BREAK WHEN I WAS EXTRACTING FROM SQLPLUS/ORACLE

变成

KEYWORD|STRING OF MORE DATA|4522452|5345245245|REALLY REALLY REALLY REALLY LONGSTRING THAT INSERTED A LINE BREAK WHEN I WAS EXTRACTING FROM SQLPLUS/ORACLE

这是在HP-UNIX环境中,我可以将文件移动到另一个系统(安装了PowerShell和ruby的Windows框)。

6 个答案:

答案 0 :(得分:2)

我不知道您使用的是哪种工具,但是您可以使用此正则表达式匹配\n之后未跟随\r的每个KEYWORD(或SPACE}可以将其替换为\r(?!KEYWORD),你就可以拥有它。

DEMO

正则表达式:{{1}}(使用全局修饰符)

答案 1 :(得分:2)

Ruby的Array有一个很好的方法叫做slice_before,它继承自Enumerable,在这里拯救:

require 'pp'

text = 'KEYWORD|DATA STRING HERE|32|50135|ANOTHER DATA STRING
KEYWORD|STRING OF DATA|1333|552555666|ANOTHER STRING
KEYWORD|STRING OF MORE DATA|4522452|5345245245|REALLY REALLY REALLY REALLY
LONGSTRING THAT INSERTED A LINE BREAK WHEN I WAS EXTRACTING FROM SQLPLUS/ORACLE
KEYWORD|.....'

pp text.split("\n").slice_before(/^KEYWORD/).map{ |a| a.join(' ') }

=> ["KEYWORD|DATA STRING HERE|32|50135|ANOTHER DATA STRING",
 "KEYWORD|STRING OF DATA|1333|552555666|ANOTHER STRING",
 "KEYWORD|STRING OF MORE DATA|4522452|5345245245|REALLY REALLY REALLY REALLY LONGSTRING THAT INSERTED A LINE BREAK WHEN I WAS EXTRACTING FROM SQLPLUS/ORACLE",
 "KEYWORD|....."]

此代码只是在换行符上拆分文本,然后使用slice_before将生成的数组拆分为子数组,每个文本块以/^KEYWORD/开头。然后它遍历生成的子阵列,将它们与单个空间连接起来。任何未预先拆分的行都将保持不变。被破坏的人会重新加入。

对于实际使用,您可能希望将pp替换为常规puts

至于用Ruby将代码移动到Windows,为什么?在HP-Unix上安装Ruby并在那里运行它。这是更自然的契合。

答案 2 :(得分:1)

这个简短的awk oneliner应该做的工作:

awk '/^KEYWORD/{print ""}{printf $0}' file

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed ':a;$!{N;/\n.*|/!{s/\n/ /;ba}};P;D' file

在模式空间中保留两行,如果第二行不包含|,则用空格替换换行并重复直到它或者到达文件的末尾。

这假定最后一个字段是溢出的字段,否则使用KEYWORD这样:

sed ':a;$!{N;/\nKEYWORD/!{s/\n/ /;ba}};P;D' file

答案 4 :(得分:1)

Powershell方式:

[System.IO.File]::ReadAllText( "c:\myfile.txt" ) -replace "`r`n(?!KEYWORD)", ' '

答案 5 :(得分:0)

您可以使用sedawk(首选)来执行此操作»

  • sed -n 's|\r||g;$!{1{x;d};H};${H;x;s|\n\(KEYWORD\)|\r\1|g;
    s|\n||g;s|\r|\n|g;p}' file.txt

  • awk 'BEGIN{ORS="";}NR==1{print;next;}/^KEYWORD/ {
    {1}}


注意: 将每个命令({print"\n";print;next;}{print;}' file.txtsed)写入一行