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用于特定的,受约束的源代码。在这种情况下,似乎我们可以做出这些假设:
- 每个相关语句在一行上
- 每个相关行上只有一个语句。
- 第一个参数不包含逗号。
- 没有字符串文字或评论可能意外匹配。
给定这些约束,我们要匹配:
-
strlcpy
名称和打开括号(之间有可选的空间):bstrlcpys*(
- 第一个参数,直到第一个逗号:
[^,]+
- 其余参数:
,.+
- 最后的闭合括号和半隆:
)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",并在脚本后面使用 -
(...)
:1
和2
请参阅括号(...)
之间的相应匹配正则拨正力。请注意,由于-r
参数,无需逃脱括号。 - 包含括号的正则态度,需要将它们逃脱为
(
- 编辑到位的文件的最后一步,添加
-i
选项以执行此操作。
尝试以下:
sed 's/^(s*strlcpy()([^,]+)(,.*)();.*)$/123,sizeof(2)4/'