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

1 bash shell-script text-processing

输入:

 int foo(int a, void * b, int c);
Run Code Online (Sandbox Code Playgroud)

输出:

 int foo(int, void *, int);
Run Code Online (Sandbox Code Playgroud)

想用“,”作为匹配模式。如果 "," 模式匹配,则删除前一个单词 ie a, b& c

ste*_*ver 6

你可以使用前瞻(有时称为零长度断言,如果正则表达式引擎使用的是它如用perl支持,配合和当且仅当随后删除的文字字符的任何非零序列),

perl -pe 's/\w+(?=,)//g'
Run Code Online (Sandbox Code Playgroud)

如果您想在断言中包含其他字符 - 例如)int c您可以将其添加为[...]字符列表的一部分之后的终止右括号

perl -pe 's/\w+(?=[,)])//g'
Run Code Online (Sandbox Code Playgroud)

如果您还想删除任何前导空格,请尝试

perl -pe 's/\s*\w+(?=[,)])//g'
Run Code Online (Sandbox Code Playgroud)

把它们放在一起,我们得到

$ echo 'int foo(int a, void * b, int c);' | perl -pe 's/\s*\w+(?=[,)])//g'
int foo(int, void *, int);
Run Code Online (Sandbox Code Playgroud)

与较新版本的 sed 一样,可以通过添加-i命令行开关使 perl 对文件进行“就地”操作。