Bash 操作文本文件中的行

Bash 操作文本文件中的行,bash,perl,unix,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行的末尾,但它们在文本文件中作为换行符写入。如果前一行不符合数字^Y,是否有方法附加前一行,以及在发生这种情况时添加一组特定的字符 ^在这种情况下,Y是字段分隔符。请救命 use strict; use warnings;

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

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行的末尾,但它们在文本文件中作为换行符写入。如果前一行不符合数字^Y,是否有方法附加前一行,以及在发生这种情况时添加一组特定的字符

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

请救命

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
$ 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
在这里,我们使用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

请告诉我们您尝试过什么?堆栈溢出不是免费编程的来源,尽管总是有人看重自己的积分,而不是网站的完整性。有时候,不管你对工作有多了解,你都会遇到无法超越的情况。语言、库和系统总是有未记录的角落,而且偶尔会有一个bug使文档变得毫无意义。这种情况通常只能通过坚持和顽强地拒绝接受失败来解决。在这样的情况下,堆栈溢出会发生,但看起来并不是这样。据我所知,您可能完全无法编写一行代码。如果是这样的话,那么请不要只是抓住机会引起某人的注意,他会回答任何为了几点而向他们提出的问题。相反,如果你需要任何其他专业建议,请做你想做的事情:找一个能帮助你的人,并为他们的麻烦支付合理的费用。“伴侣”费率只适用于少数几个朋友和熟人,在一个完全陌生的世界里寻求专业帮助是很不礼貌的。如果您要发布awk解决方案,请不要用“拯救”打开,这只会说您不懂Perl。您还应该正确地记录您的代码,并在命令行上描述它的限制和用法。对于新加入者来说,缺少awk标记可能意味着不了解它的存在。awk比perl早十年,而且更容易学习。这里的答案与我是否使用/喜欢/了解perl无关。我非常感谢它的正则表达式功能。谢谢你没有在这个网站上发布我的第一篇文章。我像这样试过你的命令:awk'{if/\^Y/{ifp print p;p=$0}else p=p$0}END{print p}我得到:awk:syntax error靠近第1行awk:invalign statement靠近第1行awk:syntax error靠近第1行awk:bailing out靠近第1行如果做得对,我会付钱给别人,因为这正是我需要的。如果使用输入文件将其复制/粘贴到bash shell中,它应该可以正常工作。如果您不熟悉CLI,可能会让朋友/同事帮您入门。可能是因为文件中的分隔符^Y实际上是十六进制19?