如何匹配正则表达式中新文本行的每个开头?

时间:2015-06-13 17:32:28

标签: regex csv

我正在使用文本文件创建CSV文件。对Regex来说很新,我需要完成CSV文件。

我需要做的是删除每一行新文本并将它们放在一行中。

例如,这个数据:

ABC Company INC
123 Some Street 
Winchester, KY

需要采用以下格式:

ABC Company INC;123 Some Street;Winchester, KY

加号,在我的文件中......它有几个条目,每个公司都有一个换行符。

它是这样的:

ABC Company
123 Street
Winchester, KY

DEF Company
456 Street
Winchester, KY

并且如此:

ABC Company;123 Street;Winchester, KY
DEF Company;456 Street;Winchester, KY

我们可以在正则表达式中这样做吗?如果是这样,那怎么样?

更多信息:

这不适用于编程或编码相关问题。

它更多的数据转换或操作。我只使用文本编辑器。我需要编辑文本文件(挖掘的数据)并将其转换为CSV文件。

如果我们可以使用其他工具,那么请提及它。

更新

有了这个特殊的问题,凭借我目前的知识水平,我发现波希米亚的答案在我的案例中更有帮助。它确实帮助我完成了这项任务。

然而, Sobrique 提供的答案使用起来更强大。只有我不知道如何使用它。我用Pearl脚本做的是......我复制了脚本的整个打印输出,因为我不知道如何将它输出到文件中。另外,我还遇到了一些不准确的数据。它是一个很棒的工具,只是我现在无法处理它。

2 个答案:

答案 0 :(得分:1)

做这样的替换:

 Search: (?<=.)$(\s(?!^$))+^
Replace: ;

然后,删除空白行:

 Search: ^$\s+
Replace: <nothing>

那些环顾四周是为了确保空行(零长度)不匹配。

答案 1 :(得分:1)

正则表达式并不是这项工作的真正工具。他们是关于模式匹配的。

您可能会发现tr是合适的,因为您可以将linefeed音译为;

或者在perl:

#!/usr/bin/perl

use strict;
use warnings;

while (<DATA>) {
    chomp;
    print;
    if (m/^\s*$/) {
        print "\n";
    }
    else {
        print ";";
    }
}

__DATA__
ABC Company
123 Street
Winchester, KY

DEF Company
456 Street
Winchester, KY

会做的伎俩。

把它变成一个单行:

perl -e 'while (<>) { chomp; print; if (m/^\s*$/) { print "\n" } else { print ";" } }' yourfile

perl -i启用'inplace editing' - 这只会打印它)