Ruby 如果行不以关键字开头,请删除换行符
我有一个平面锉刀,上面的线条看起来像Ruby 如果行不以关键字开头,请删除换行符,ruby,regex,powershell,sed,awk,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
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 box)。我不知道您在使用什么工具,但您可以使用此正则表达式匹配每个
\n
(或者\r
)它后面没有关键字
,因此您可以将它替换为空格
,这样您就拥有了它
正则表达式:
\r(?!KEYWORD)
(带全局修饰符)我不知道您正在使用什么工具,但是您可以使用此正则表达式匹配每个\n
(或者可能\r
)后面没有关键字的,这样您就可以将其替换为空格,您将拥有它
正则表达式:\r(?!关键字)
(带全局修饰符)您可以为此使用sed
或awk
(首选)
sed-n的|\r | | g;$!{1{x;d};H}${H;x;s |\n\(关键字\)|\r\1 | g;
s |\n | g;s | \r | \n | g;p}file.txt
awk'BEGIN{ORS=”“;}NR==1{print;next;}/^KEYWORD/
{print”\n;print;next;}{print;}file.txt
注意:将每个命令(sed
,awk
)写在一行中您可以为此使用sed
或awk
(首选)»
sed-n的|\r | | g;$!{1{x;d};H}${H;x;s |\n\(关键字\)|\r\1 | g;
s |\n | g;s | \r | \n | g;p}file.txt
awk'BEGIN{ORS=”“;}NR==1{print;next;}/^KEYWORD/
{print”\n;print;next;}{print;}file.txt
注意:将每个命令(sed
,awk
)写在一行中这个简短的awk单行程序应该可以完成以下任务:
awk '/^KEYWORD/{print ""}{printf $0}' file
这款短款awk oneliner应能完成以下任务:
awk '/^KEYWORD/{print ""}{printf $0}' file
Ruby的数组有一个很好的方法,名为Enumerable,它继承自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\u
将生成的数组拆分为子数组,每个文本块以/^KEYWORD/
开头。然后,它遍历生成的子数组,用一个空格将它们连接起来。任何未预拆分的行都将被单独保留。断开的会重新连接
要真正使用,您可能需要将pp
替换为常规的put
至于用Ruby将代码移动到Windows,为什么?在HP Unix上安装Ruby并在那里运行。这是一个更自然的匹配。Ruby的数组有一个很好的方法,称为从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\u
将生成的数组拆分为子数组,每个文本块以/^KEYWORD/
开头。然后,它遍历生成的子数组,用一个空格将它们连接起来。任何未预拆分的行都将被单独保留。断开的会重新连接
要真正使用,您可能需要将pp
替换为常规的put
至于用Ruby将代码移动到Windows,为什么?在HP Unix上安装Ruby并在那里运行。这是一种更自然的搭配。这可能适合您(GNU-sed):
在模式空间中保留两行,如果第二行不包含空格,则用空格替换换行符并重复,直到换行符包含空格或到达文件末尾
这假设最后一个字段是溢出的字段,否则使用关键字
,例如:
sed ':a;$!{N;/\nKEYWORD/!{s/\n/ /;ba}};P;D' file
这可能适用于您(GNU-sed):
在模式空间中保留两行,如果第二行不包含空格,则用空格替换换行符并重复,直到换行符包含空格或到达文件末尾
这假设最后一个字段是溢出的字段,否则使用关键字
,例如:
sed ':a;$!{N;/\nKEYWORD/!{s/\n/ /;ba}};P;D' file
动力壳道:
[System.IO.File]::ReadAllText( "c:\myfile.txt" ) -replace "`r`n(?!KEYWORD)", ' '
动力壳道:
[System.IO.File]::ReadAllText( "c:\myfile.txt" ) -replace "`r`n(?!KEYWORD)", ' '
你能做你的文件.txt吗?你能做你的文件.txt吗?我正在把它复制到一台windows机器上,并尝试用notepad++或ruby替换它。谢谢。如果不是太长的文件,你甚至可以使用我给你的带有演示的页面来替换。我正在将它复制到windows计算机上,并将尝试使用该正则表达式替换为notepad++或ruby。谢谢。如果不是太长的文件,你甚至可以用我给你的带有演示的页面来替换。解决方案+1(几乎)。如果$0包含printf格式字符,printf$0将严重混乱。printf的语法是printf格式,数据
,因此可以这样使用:printf“%s”,$0
。您还需要为解决方案(几乎)添加一个END{print”“}
+1。如果$0包含printf格式字符,printf$0将严重混乱。printf的语法是printf格式,数据
,因此可以这样使用:printf“%s”,$0
。您还需要添加一个END{print”“}
。啊,sed脚本的清晰度:-)。sed是一个很好的工具,可以在一行上进行简单的替换,对于任何其他内容,只需使用awk即可。似乎不值得发布sed,因为没有人应该这样做。@EdMorton-我在回答中包含了sed
解决方案,因为问题也被标记为sed
。啊,明白了。我的印象是标签中提到的工具是OP认为可以解决他的问题的工具,并不是说他在寻找所有这些工具的解决方案,而是我知道你来自哪里,谢谢。啊,sed脚本的清晰性:-)。sed是一个很好的工具,可以在一行上进行简单的替换,对于其他任何事情,只需使用awk。发布sed似乎不值得,因为没有人应该这样做。@EdMorton-我已经包括了se