【发布时间】:2021-06-02 17:01:39
【问题描述】:
我用一些正则表达式编写了一个脚本来进行元编程。但是,我发现我无法使用一些较新的正则表达式功能,例如负后视,并且由于我在该机器上的限制,我无法安装 Perl 或其他可能的解决方案来获得访问权限。因此,我正在寻找一个 bash 脚本来完成从文本字符串中删除某些单词,而该字符串恰好是从 C++ 文件中提取的。
这是我得到的文本输入示例,它看起来像 C++ 函数签名:
int test(int aaaa, Vector<int, bool*> bbbb, Bar**cccc, Foo, Transform&eeee)
我想删除代表变量名称的字符串。在此示例中,即:aaaa、bbbb、cccc 和 eeee。
输出应该是这样的,就好像它只是一个前向声明:
int test(int, Vector<int, bool*>, Bar**, Foo, Transform&)
我的解决方案是做一些事情,但我不确定是否有更好的 bash 解决方案来满足我的需求-结束。
我用 JS 编写了这个脚本来帮助完成我想要的。希望对你有帮助!
var text = 'int test(int aaaa, Vector<int, bool*> bbbb, Bar**cccc, Foo, Transform&eeee)'
var index = 0
var insideparentheses = false
var deleting = false
var readdatatype = false
var insidebrackets = 0
while(index < text.length) {
if(text[index] == '(') {
insideparentheses = true
deleting = false
readdatatype = false
readletter = false
}
if(text[index] == ')') {
insideparentheses = false
deleting = false
readdatatype = false
readletter = false
}
if(text[index] == '<') {
insidebrackets++
}
if(text[index] == '>') {
insidebrackets--
readletter = true
}
if(insideparentheses && insidebrackets == 0) {
if(text[index].match(/[a-zA-Z]/gi) != null) {
readletter = true
}
if(text[index] == '*') {
readdatatype = true
}
if(text[index] == '&') {
readdatatype = true
}
if(text[index] == ' ') {
if(readletter) {
readdatatype = true
} else {
readdatatype = false
}
}
if(text[index] == ',') {
deleting = false
readdatatype = false
readletter = false
}
if(text[index].match(/[_ a-zA-Z]/gi) != null) {
if(readdatatype) {
deleting = true
} else {
deleting = false
}
}
if(deleting) {
text = text.substring(0, index) + text.substring(index + 1)
} else {
index++
continue
}
} else {
index++
continue
}
}
console.log(text)
编辑:变量可以命名为任何在 C++ 中有效的名称,例如 [_a-zA-Z]+,而不仅仅是同一个字母的 4 个,重复 4 次...:P
【问题讨论】:
-
我确信这可以在
sed中完成,但我也确信这将是相当可怕的。是否可以接受 awk 解决方案? -
嗨。我对正则表达式非常满意,
sed不适用于我的解决方案,因为我的平台上没有像lookbehind 这样的正则表达式功能。如果您想出一个不使用后向/前瞻的sed解决方案,我可以尝试一下!此外,awk无法安装,这是我肯定已经尝试过的。 :P -
Perl 怎么样?
-
@tripleee,在问题中,我指定我无法在环境中安装 Perl 作为解决此问题的方法。
-
哦,对不起,我错过了。您可能可以做一些逻辑将整行划分为保持空间和模式空间,然后处理模式空间,然后将它们合并在一起;但这些解决方案往往是只写的,特别是如果您对
sed概念不是很熟悉。参见例如一些potong's answers 用于演示此类解决方案的外观。
标签: string bash shell sed replace