我在文件中有一些文件,我的行以#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)
答案 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
。你只需迭代所有的线条,如果你遇到需要更换的东西,你只需要打印输出,无论你想要替换它,只需按原样打印其他线条。