操纵文本文件中的行

时间:2017-12-20 20:51:24

标签: bash perl unix

我有一个包含以下内容的文本文件:

1234  ^Y DATA ^Y DATA
1235  ^Y DATA ^Y DATA
1236  ^Y DATA ^Y DATA
/text text
/more text
1237  ^Y DATA ^Y DATA

第4行和第5行属于第3行的末尾,但它们在文本文件中写为换行符。如果它不符合NUMBER ^ Y,有没有办法追加上一行,并在发生这种情况时添加一组特定的字符?

^ Y在这种情况下是字段分隔符。

3 个答案:

答案 0 :(得分:0)

use strict;
use warnings;

my @out;
while (my $line = <DATA>) {
    chomp $line;
    # regex to check for NUMBER ^Y; 
    if ($line =~ /^\d+\s+\^Y/) {
        push @out, $line;
    } else {
        # append to the last element of the array
        $out[-1] .= ' *chars to add* '.$line;
    }
}

print $_."\n" for @out;

__DATA__
1234  ^Y DATA ^Y DATA
1235  ^Y DATA ^Y DATA
1236  ^Y DATA ^Y DATA
/text text
/more text
1237  ^Y DATA ^Y DATA

答案 1 :(得分:0)

awk救援!

$ awk '{if(/\^Y/){if(p) print p; p=$0} else p=p $0} 
    END{print p}' file

1234  ^Y DATA ^Y DATA
1235  ^Y DATA ^Y DATA
1236  ^Y DATA ^Y DATA/text text/more text
1237  ^Y DATA ^Y DATA

答案 2 :(得分:0)

在这里,我们使用s修饰符检查并删除从该行开始的不等于数字之前的entermark。

use strict;
use warnings;

my $text = do { local $/; <DATA> };

$text=~s/\n([^\d])/ <INSERT TEXT> $1/sg;

print $text;

__DATA__
1234  ^Y DATA ^Y DATA
1235  ^Y DATA ^Y DATA
1236  ^Y DATA ^Y DATA
/text text
/more text
1237  ^Y DATA ^Y DATA

输出:

1234  ^Y DATA ^Y DATA
1235  ^Y DATA ^Y DATA
1236  ^Y DATA ^Y DATA <INSERT TEXT> /text text <INSERT TEXT> /more text
1237  ^Y DATA ^Y DATA