Windows 如何在Perl中连接延续行?

Windows 如何在Perl中连接延续行?,windows,perl,Windows,Perl,我有一个CSV文件,其中包含如下字符串: ID1;banana | apple | oranges ID1;banana | apple | oranges 我希望每次在行首有一个管道时,字符串都会附加到前一行,输出应该是这样的: ID1;banana | apple | oranges ID1;banana | apple | oranges 如何删除以管道开头的行之前的换行符??在一个粗俗的单行中,删除管道之前的返回: perl -ne '$s = do {local $/; <

我有一个CSV文件,其中包含如下字符串:

ID1;banana
| apple
| oranges
ID1;banana | apple | oranges
我希望每次在行首有一个管道时,字符串都会附加到前一行,输出应该是这样的:

ID1;banana
| apple
| oranges
ID1;banana | apple | oranges

如何删除以管道开头的行之前的换行符??

在一个粗俗的单行中,删除管道之前的返回:

perl -ne '$s = do {local $/; <>}; $s =~ s/\n\|/ |/g; print $s' file.csv
perl-ne'$s=do{local$/;}$s=~s/\n\|/|/g;打印$s文件.csv

在一个粗俗的单衬里中,在管道之前移除回流:

perl -ne '$s = do {local $/; <>}; $s =~ s/\n\|/ |/g; print $s' file.csv
perl-ne'$s=do{local$/;}$s=~s/\n\|/|/g;打印$s文件.csv

您可以只在|不是第一个字符时打印回车,而不是尝试退格/擦除已打印的内容:

perl -n -e 'chomp; /^\s*\|/? print " $_":  print "\n$_" ' yourfile.txt

您可以只在a |不是第一个字符时打印回车,而不是尝试退格/擦除已打印的内容:

perl -n -e 'chomp; /^\s*\|/? print " $_":  print "\n$_" ' yourfile.txt

显示单个CSV字段值的字符串?如果是这样,那么您应该使用
Text::CSV
将每一行划分为字段(因为它的
getline
方法是处理包含嵌入新行的数据的最简单方法),并且如果新行位于管道字符之前,您可以使用替换
s/\n(?=\\\\)//g
将其更改为空格

这里有一个例子

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new({ binary => 1, eol => $/ });

while (my $row = $csv->getline(*DATA)) {
  s/\n(?=\|)/ /g for @$row;
  print "$_: $row->[$_]\n" for 0 .. $#$row;
  print "\n";
}

__DATA__
"ID1;banana
| apple
| oranges",f2,f3
g1,g2,g3
输出

0: ID1;banana | apple | oranges
1: f2
2: f3

0: g1
1: g2
2: g3

如果您的情况与此不同,那么您需要解释。

是显示单个CSV字段值的字符串吗?如果是这样,那么您应该使用
Text::CSV
将每一行划分为字段(因为它的
getline
方法是处理包含嵌入新行的数据的最简单方法),并且如果新行位于管道字符之前,您可以使用替换
s/\n(?=\\\\)//g
将其更改为空格

这里有一个例子

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new({ binary => 1, eol => $/ });

while (my $row = $csv->getline(*DATA)) {
  s/\n(?=\|)/ /g for @$row;
  print "$_: $row->[$_]\n" for 0 .. $#$row;
  print "\n";
}

__DATA__
"ID1;banana
| apple
| oranges",f2,f3
g1,g2,g3
输出

0: ID1;banana | apple | oranges
1: f2
2: f3

0: g1
1: g2
2: g3


如果您的情况与此不同,那么您需要解释。

您想添加一个退格,还是删除前一行的换行符?多行正则表达式可以解决这个问题,例如:
/\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/m
。有时,当人们有一个不需要的控件字符时,他们会说“我知道,我会插入退格”。现在它们有两个不需要的控制字符…您想添加一个退格,还是删除前一行的换行符?多行正则表达式可以解决这个问题,例如:
/\n\\\\\\\\\\\\\\\\/m
。有时,当人们有一个不需要的控制字符时,他们会说“我知道,我会插入退格”。现在它们有了两个不需要的控制字符……大部分都可以通过开关来完成:
perl-0777-wpe的/\n\\\124;/|/g'file.csv
(唯一让它“黑客化”的是你没有启用警告,你甚至应该为一行代码启用警告。)是的,我还没有完全熟悉
-0777
。你会不会碰巧有一个链接到一个可以讨论它的资源?它的使用有什么陷阱吗?tyHello Miller,我尝试了你的代码,但它说:>此时出乎意料,我如何避免这种情况?谢谢。我可以推断这意味着你在windows而不是unix机器上。在表达式周围使用双引号而不是单引号。是的,对,我现在正在使用windows。非常感谢你!!它工作得很好:)大部分都可以通过开关来完成:
perl-0777-wpe的/\n\\\124;/|/g'file.csv
(唯一让它“黑客化”的是你没有启用警告,你甚至应该为一行代码启用警告。)是的,我还没有完全熟悉
-0777
。你会不会碰巧有一个链接到一个可以讨论它的资源?它的使用有什么陷阱吗?tyHello Miller,我尝试了你的代码,但它说:>此时出乎意料,我如何避免这种情况?谢谢。我可以推断这意味着你在windows而不是unix机器上。在表达式周围使用双引号而不是单引号。是的,对,我现在正在使用windows。非常感谢你!!它工作得很好:)聪明的方法。下面的内容有点紧:
perl-pe'chomp;s/^(?)/\n/如果$。>1;' yourfile.txt
Hello Magnus,当我尝试您的代码时,我发现:“/?”不被识别为内部或外部命令、可操作程序或批处理文件。我能改进什么?听起来你可能在Windows上?那里的命令行引用规则可能不同。。。我只在OS XWindows上测试过,命令行参数需要双引号,这意味着您可能希望使用类似
qq($\ux)
的东西来插值字符串……聪明的方法。下面的内容有点紧:
perl-pe'chomp;s/^(?)/\n/如果$。>1;' yourfile.txt
Hello Magnus,当我尝试您的代码时,我发现:“/?”不被识别为内部或外部命令、可操作程序或批处理文件。我能改进什么?听起来你可能在Windows上?那里的命令行引用规则可能不同。。。我只在OS XWindows上测试过,命令行参数需要双引号,这意味着您可能需要使用类似
qq($\ux)
的东西来插值字符串。。。