当正则表达式匹配时,在行的开头附加一个字符串

时间:2012-09-17 08:25:30

标签: regex perl append

我有一个文件例如

Car   class    rating
ford    c        ok
merc    a        Vgood
BMW     a        Toogood
kia     c         ok

我想在行的开头追加'prefer'和'dontprefer',分别找到“a”和“c”。

我一直在这样做,将“a”和“c”分隔成不同的文件,然后追加所需的。

perl -ne '/a/ && print' file1.l > file2.l 

perl -ple 's/^/prefer/' file2.l

我一直在为每个正则表达式匹配执行此操作,然后将所有文件组合在一起。

那么有没有其他简单的代码将字符串附加到同一个文件中,而不是每次匹配正则表达式时都将文件竖起来?

示例输出:

  .  .          Car   class    rating

dontprefer    ford    c        ok
prefer        merc    a        Vgood
prefer        BMW     a        Toogood
dontprefer    kia     c         ok

7 个答案:

答案 0 :(得分:1)

这样的事情:

use strict;
use warnings;

my %prefs = (
    a => 'prefer', 
    c => 'dontprefer',
);

while (my $line = <>) {

    my $class = (split /\s+/, $line)[1];
    print $prefs{$class} if $class && $prefs{$class};
    print $line;
}

答案 1 :(得分:1)

$ perl -pale 'BEGIN { %tag = ( a => "prefer", c => "dontprefer" ); } $_ = "$tag{$F[1]}\t$_" if exists $tag{$F[1]};' infile > outfile

答案 2 :(得分:1)

试试这个

perl -pe 's/(?=\S+\s+(a|(c))\s+)/($2&&"dont").($1&&"prefer\t")/e'

答案 3 :(得分:1)

perl -lne 'print"prefer     ".$_ if(/\s+[a]\s+/);print "dontprefer ".$_ if(/\s+[c]\s+/) ' your_file

答案 4 :(得分:0)

试试这个正则表达式:

perl -pe 's/(?=.*?\sa\s)/prefer\t$1/ && print $1'

它会先于检查一行中是否有'a',在这种情况下,用前面的'prefer'替换该行。

放在一起:

perl -pe 's/(?=.*?\sa\s)/prefer\t$1/g' file1.l | perl -pe 's/(?=.*?\sc\s)/dontprefer\t$1/g' > file2.l

答案 5 :(得分:0)

我不确定这是否对您有所帮助,

  

你可以在linux中使用SED命令一行进行匹配和添加   '喜欢'和'不喜欢'在线的开头

答案 6 :(得分:0)

你似乎是在shell中这样做,所以除了perl之外我还会提供其他一些解决方案。

首先,awk有时是一种比perl更简单的编程语言:

$ awk '$2=="a"{p="prefer\t"} $2=="c"{p="dontprefer"} NR==1{p="\t"} {printf("%s\t%s\n",p,$0)}' input.txt
                Car   class    rating
dontprefer      ford    c        ok
prefer          merc    a        Vgood
prefer          BMW     a        Toogood
dontprefer      kia     c         ok

接下来,sed虽然含糊不清,但却可以将您的逻辑浓缩到一个非常狭小的空间中:

$ sed '1s/^/^I^I/;/ a /s/^/prefer^I^/;/ c /s/^/dontprefer^I/' input.txt
                Car   class    rating
dontprefer      ford    c        ok
prefer          merc    a        Vgood
prefer          BMW     a        Toogood
dontprefer      kia     c         ok

^I是标签。请注意,根据您的平台,sed可能包含允许您更有效地打印标签(或执行其他操作)的选项。这个sed脚本应该无处不在。它也会受到影响,因为它匹配行上的ac ,而不仅仅是第二列。它还假设您使用streteches of spaces来分隔字段,而不是制表符。如果它们很重要,可以扩展regexp来处理这些问题,但是他当然可以处理你的样本数据。