如何使用Perl识别字符串中#的存在

时间:2014-04-15 14:31:00

标签: regex perl

我在文件中有一些文件,我的行以#define开头。 我想用#define替换整个行与其他字符串,但我的代码不识别字符串。我该怎么做?

该文件包含

等数据
   extern const  Bit_Fld Alert;
   extern const  Bit_Fld selected;
   #define Gettest1_TX_DEV_MODE_CH0()      Read_byte_bit_Fld(&test1_DEV_MODE_CH0)
   #define Gettest2_TX_DEBUG_MODE_CH0()    Read_byte_bit_Fld(&test2_DEBUG_MODE_CH0)
   #define Gettest3_TX_FUNN_STAT_CH0()     Read_byte_bit_Fld(&test3_FUNN_STAT_CH0)

我想更改以#define开头的数据

   int Gettest1_DEV_MODE_CH0(void)        { return (Byte_bit_Fld(&test1_DEV_MODE_CH0));}

与上述#define相同的剩余行,除了#define行外,不更改任何其他数据。怎么办呢?

如何编辑该特定字符串并将其替换为同一个文件?

n如何删除第二个字符串将其替换为

   int Gettest1_DEV_MODE_CH0(void)

3 个答案:

答案 0 :(得分:4)

如果您使用绑定运算符=~而不是赋值运算符=

,您的代码将按预期工作
 if($line =~ /^\#define/)

此外,#不是正则表达式中的特殊字符,因此转义它是可选的。

 if($line =~ /^#define/)

答案 1 :(得分:2)

怎么样:

while(<DATA>) {
    chomp;
    s/^#define\s+(\w+)\(\)\s+Read_(\w*Fld.+)/int $1(void) { return ($2);}/;
    say $_;
}
__DATA__
extern const  Bit_Fld Alert;
extern const  Bit_Fld selected;
#define Get_DEV_MODE()      Read_Fld(&DEV_MODE)
#define Get_DEBUG_MODE()    Read_Fld(&DEBUG_MODE)
#define Get_FUNN_STAT()     Read__Fld(&FUNN_STAT)
#define Gettest1_TX_DEV_MODE_CH0()      Read_byte_bit_Fld(&test1_DEV_MODE_CH0)
#define Gettest2_TX_DEBUG_MODE_CH0()    Read_byte_bit_Fld(&test2_DEBUG_MODE_CH0)
#define Gettest3_TX_FUNN_STAT_CH0()     Read_byte_bit_Fld(&test3_FUNN_STAT_CH0)

<强>输出:

extern const  Bit_Fld Alert;
extern const  Bit_Fld selected;
int Get_DEV_MODE(void) { return (Fld(&DEV_MODE));}
int Get_DEBUG_MODE(void) { return (Fld(&DEBUG_MODE));}
int Get_FUNN_STAT(void) { return (Fld(&FUNN_STAT));}
int Gettest1_TX_DEV_MODE_CH0(void) { return (byte_bit_Fld(&test1_DEV_MODE_CH0));}
int Gettest2_TX_DEBUG_MODE_CH0(void) { return (byte_bit_Fld(&test2_DEBUG_MODE_CH0));}
int Gettest3_TX_FUNN_STAT_CH0(void) { return (byte_bit_Fld(&test3_FUNN_STAT_CH0));}

正则表达式的解释:

/               : regex delimiter
    ^           : start of string
    #define     : literally #define
    \s+         : one or more spaces
    (\w+)       : group 1, one or more word character [a-zA-Z0-9_]
    \(\)        : a pair of parenthesis
    \s+         : one or more spaces
    Read_       : literally Read_
    (           : start of group 2
        \w*     : 0 or more wword character
        Fld     : literally Fld
        .+      : One or more characterter
    )           : end group 
/               : regex delimiter

例如输入行:

#define Gettest1_TX_DEV_MODE_CH0()  Read_byte_bit_Fld(&test1_DEV_MODE_CH0)
        ^________  $1  ________^         ^__________    $2   ____________^

将给予(替换部分:int $1(void) { return ($2);}):

int Gettest1_TX_DEV_MODE_CH0(void) { return (byte_bit_Fld(&test1_DEV_MODE_CH0));}

答案 2 :(得分:1)

chomp $line;
if($line =~ m/^#define/)
{
    print OUTPUTFILE $whatever, "\n";
}
else
{
    print OUTPUTFILE $line, "\n";
}

这将找到以确切的术语#define开头的所有行。

当您想要替换一些但不是所有行时,最简单的方法是打开第二个文件,打印到OUTPUTFILE。你只需迭代所有的线条,如果你遇到需要更换的东西,你只需要打印输出,无论你想要替换它,只需按原样打印其他线条。