Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如果行不以关键字开头,请删除换行符_Ruby_Regex_Powershell_Sed_Awk - Fatal编程技术网

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