1

次のような行を含むフラットファイルがあります

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 ボックス) に移動できます。

4

6 に答える 6

2

Rubyの配列には、slice_beforeEnumerableから継承するという優れたメソッドがあります。これは、ここで役に立ちます。

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、結果の配列をサブ配列に分割するために使用します。サブ配列は、で始まるテキストのブロックごとに1つずつです/^KEYWORD/。次に、結果のサブ配列をウォークスルーし、それらを単一のスペースで結合します。事前に分割されなかった行はすべてそのままになります。壊れたものは再結合されます。

pp実際に使用する場合は、通常のに置き換えたいと思うでしょうputs

Rubyを使用してコードをWindowsに移動するのはなぜですか?HP-UnixにRubyをインストールし、そこで実行します。より自然なフィット感です。

于 2012-11-27T14:30:44.530 に答える
2

I don't know what tools are you using, but you can use this regex to match every \n (or maybe \r) that isn't followed by KEYWORD so you can replace it for SPACE and you would have it.

DEMO

Regex: \r(?!KEYWORD) (With global modifier)

于 2012-11-27T12:30:08.073 に答える
1

PowerShellの方法:

[System.IO.File]::ReadAllText( "c:\myfile.txt" ) -replace "`r`n(?!KEYWORD)", ' '
于 2012-11-27T15:01:16.753 に答える
1

この短い awk oneliner は仕事をするべきです:

awk '/^KEYWORD/{print ""}{printf $0}' file
于 2012-11-27T13:34:35.907 に答える
1

これはうまくいくかもしれません(GNU sed):

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

パターン スペースに 2 行を保持し、2 行目に が含まれていない場合は|、改行をスペースに置き換え、スペースが含まれるか、ファイルの最後に到達するまで繰り返します。

これは、最後のフィールドがオーバーフローするフィールドであると想定しています。それ以外の場合は、次のKEYWORDように使用します。

sed ':a;$!{N;/\nKEYWORD/!{s/\n/ /;ba}};P;D' file
于 2012-11-27T14:54:17.940 に答える
0

sedこれにはor (推奨) を使用できます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/
    {print"\n";print;next;}{print;}' file.txt


注: 各コマンド ( sedawk) は 1 行で記述します。

于 2012-11-27T12:56:42.763 に答える