我有一个平面文件,其中的行看起来像
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框)。
答案 0 :(得分:2)
我不知道您使用的是哪种工具,但是您可以使用此正则表达式匹配\n
之后未跟随\r
的每个KEYWORD
(或SPACE
}可以将其替换为\r(?!KEYWORD)
,你就可以拥有它。
正则表达式:{{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)
您可以使用sed
或awk
(首选)来执行此操作»
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.txt
,sed
)写入一行