SED-复制函数参数和评论



c文件具有带有strlcpy的100行,我必须复制第一个参数,并添加为strlpcy的第三个参数 - eg p->account to sizeof(p->account)

输入

strlcpy(p->account,gettoken(NULL,&plast));      //Set Account Information
strlcpy(p->balance,gettoken(NULL,&plast));
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),'0')); /* YYYYMMDD */
strlcpy(p->endDate,skipchr(gettoken(NULL,&plast),'0')); /* YYYYMMDD */
strlcpy(p->status,gettoken(NULL,&plast));

预期输出(复制第一个参数,并添加为第三个参数 - 将sizeof())的参数());

传递
strlcpy(p->account,gettoken(NULL,&plast),sizeof(p->account));     //Set Account Information
strlcpy(p->balance,gettoken(NULL,&plast),sizeof(p->balance));
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),'0'),sizeof(p->startDate)); /* YYYYMMDD */
strlcpy(p->endDate,skipchr(gettoken(NULL,&plast),'0'),sizeof(p->endDate)); /* YYYYMMDD */
strlcpy(p->status,gettoken(NULL,&plast),sizeof(p->status));

电流ouput(不正确的结果)

sed 's/^([^s]*strlcpy[^(]*)(([^,]*),([^)]*[^)][^;]).*/12,3,sizeof2));/' kkk1.txt
strlcpy(p->account,gettoken(NULL,&plast),sizeof(p->account));
strlcpy(p->balance,gettoken(NULL,&plast),sizeof(p->balance));
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),sizeof(p->startDate));
strlcpy(p->endDate,skipchr(gettoken(NULL,&plast),sizeof(p->endDate));
strlcpy(p->status,gettoken(NULL,&plast),sizeof(p->status));

line1、3和4未能在行末尾打印评论

第3和4行: skipchr(gettoken(NULL,&plast),'0')-参数'0'在结果中与skipchr()一起在结果中未能复制。

用正确的SED命令指导我。感谢Advnace

在一般中,这样的任务超出了sed的力量。这是因为C具有(大约)无上下文语法,该语法不能仅使用常规表达式进行解析。常规语法无法描述任意嵌套的括号。

但是,,如果您对输入有足够的约束,则可以将SED用于特定的,受约束的源代码。在这种情况下,似乎我们可以做出这些假设:

  • 每个相关语句在一行上
  • 每个相关行上只有一个语句。
  • 第一个参数不包含逗号。
  • 没有字符串文字或评论可能意外匹配。

给定这些约束,我们要匹配:

  1. strlcpy名称和打开括号(之间有可选的空间): bstrlcpys*(
  2. 第一个参数,直到第一个逗号: [^,]+
  3. 其余参数:,.+
  4. 最后的闭合括号和半隆:)s*;

然后,我们想用相同的文本替代此内容,除了我们希望sizeof组2在替换中的第3和4组之间插入:123, sizeof 24

将它们放在一个gnu sed One-Liner中:

#!/bin/sed -rf
s/b(strlcpys*()([^,]+)(,.+)()s*;)/123, sizeof 24/

通过此喂食您的示例代码给出了所需的输出:

strlcpy(p->account,gettoken(NULL,&plast), sizeof p->account);      //Set Account Information
strlcpy(p->balance,gettoken(NULL,&plast), sizeof p->balance);
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),'0'), sizeof p->startDate); /* YYYYMMDD */
strlcpy(p->endDate,skipchr(gettoken(NULL,&plast),'0'), sizeof p->endDate); /* YYYYMMDD */
strlcpy(p->status,gettoken(NULL,&plast), sizeof p->status);

(注意:我没有包含围绕sizeof参数的不必要的括号,因为这看起来像是将sizeof应用于类型而不是表达式;如果您非常强烈地希望它们想要它们,那并不困难要做。但是我不鼓励它。)

$ str="strlcpy(p->account,gettoken(NULL,&plast));"
$ sed -re '/strlcpy/{s/(([^,]*)([^)]*))/12,sizeof1)/}' <<< "$str"
strlcpy(p->account,gettoken(NULL,&plast),sizeof(p->account));

这是简短的解释,

  • /strlcpy/:找到匹配的行" strcpy",并在脚本后面使用
  • (...)12请参阅括号(...)之间的相应匹配正则拨正力。请注意,由于-r参数,无需逃脱括号。
  • 包含括号的正则态度,需要将它们逃脱为(
  • 编辑到位的文件的最后一步,添加-i选项以执行此操作。

尝试以下:

sed 's/^(s*strlcpy()([^,]+)(,.*)();.*)$/123,sizeof(2)4/'

最新更新