输入:
int foo(int a, void * b, int c);
输出:
int foo(int, void *, int);
想要使用“,”作为模式来匹配。如果“,”模式匹配,则删除前一个单词,即a
, b
& c
。
答案1
你可以使用展望(有时称为零长度断言)如果您使用的正则表达式引擎支持它,例如使用 perl,匹配并删除单词字符的任何非零序列当且仅当后跟,
perl -pe 's/\w+(?=,)//g'
如果您想在断言中包含其他字符 - 例如终止右括号)
,int c
您可以将其添加为[...]
字符列表的一部分
perl -pe 's/\w+(?=[,)])//g'
如果您还想删除任何前导空格,请尝试
perl -pe 's/\s*\w+(?=[,)])//g'
把它们放在一起我们得到
$ echo 'int foo(int a, void * b, int c);' | perl -pe 's/\s*\w+(?=[,)])//g'
int foo(int, void *, int);
-i
与较新版本的 sed 一样,可以通过添加命令行开关使 Perl 就地操作文件。
答案2
这应该有帮助:
sed -e 's/[^ ]\+\([,)]\)/\1/g'
如果你想删除这个丑陋的空间:
sed -e 's/ [^ ]\+\([,)]\)/\1/g'