1

次のような行のペアを含むファイルがあります。

 FIRST PIECE OF INFO
 PIECE 2 | PIECE 3 | PIECE 4 | ...

これを出力する必要があります:

FIRST PIECE OF INFO\tPIECE 2\tPIECE 3 ...

また、行自体でさらに正規表現の魔法を行う必要があります。

これは、perl ワンライナーを使用して実行できますか? ここでの問題は、 -p を使用するとファイルが一度に 1 行ずつ処理されるのに対し、一度に 2 行ずつ処理する必要があることです。私の解決策は、最初にファイルからすべての改行を削除する別のワンライナーを実行することでした(異なる行のペアの間に別のセパレーターがありました)が、これは面倒すぎるようで、もっと良い方法があると確信しています.

4

3 に答える 3

0

簡単な解決策は、すべての改行とパイプをタブに変えることです。少しクレイジーに聞こえますが、一見すると、あなたが望むもののように聞こえます。

perl -pwe 'tr/\n|/\t\t/' yourfile.txt

しかし、問題の説明と一致しないものがあります。あなたは言う:

のペアを含むファイルがあります

つまり、ファイルは実際には次のようになります。

FIRST PIECE OF INFO
PIECE 2 | PIECE 3 | PIECE 4 | ...
SECOND PIECE OF INFO
PIECE 2a | PIECE 3b | PIECE 4b | ...
THIRD... etc

その場合、改行をやみくもに音訳すると、すべてが 1 行に表示されます。さて、これについての私の解釈は、あなたが望むのは次のようなものであるということです(タブと改行は文字通り示されています):

FIRST PIECE OF INFO\tPIECE 2\tPIECE 3\tPIECE 4 | ...\n
SECOND PIECE OF INFO\tPIECE 2a\tPIECE 3b\tPIECE 4b | ...\n

これは単純な音訳では達成できません。

perl -plwe 'next if !/\S/; $_ = join "\t", $_, split /\s*\|\s*/,<>;' file.txt

注: このnext if !/\S/;ステートメントは、ファイルに奇数行が含まれている場合にストリームが最後に一時停止するのを防ぐためだけのものです。その場合、ファイル ハンドル<>は STDIN から読み取ろうとするので、 を押しCtrl-Dて手動で停止する必要があります。

Data::Dumper出力は次のようになり、空白文字が表示$Data::Dumper::Useqq = 1されます。

$VAR1 = "FIRST PIECE OF INFO\tPIECE 2\tPIECE 3\tPIECE 4\t...\n";
$VAR1 = "SECOND PIECE OF INFO\tPIECE 2a\tPIECE 3b\tPIECE 4b\t...\n";

上記の出力のワンライナーは次のようになりますが、多少書き直されています。

perl -MData::Dumper -nlwe '
    $Data::Dumper::Useqq=1; 
    next if !/\S/; 
    $_ = join "\t", $_, split /\s*\|\s*/,<>; 
    print Dumper $_;' file.txt
于 2012-05-15T15:25:38.683 に答える
0

さらに別のアプローチ:

perl -pe'$"="\t";chomp;$_="@{[$_,split q(\|),<>]}"'
于 2012-05-15T09:32:15.547 に答える
0

それが何であるかを知らずにあなたを助けることはできませんmore regexp magicが、これはあなたが説明したように行を組み合わせます

perl -lne 'print join "\t", $_, split /\|/, <ARGV>' myfile
于 2012-05-15T07:28:41.300 に答える