在 shell 脚本中仅删除模式匹配之前的一个单词

在 shell 脚本中仅删除模式匹配之前的一个单词

输入:

 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'

相关内容