我有一组.txt文件显示自定义语言,我希望使用Ruby脚本系统地修改文件。该语言的语法如下:
(我将[some text]用作表达式的元变量,如[atom 1]表示任意原子,[atom 2]表示与前者不同的任意原子
原子:字母数字字符串,可能被双引号括起来。例子:
same_realm
"Ok"
陈述:要么
[atom_1] = [atom_2]
或
[atom_1] = { [atom or statement 1] ... [atom or statement n] }
注释:在文本的任何一行中,#之后的任何字符都将被忽略。例如:
[atom_1] = [atom_2] #This is a comment and will be ignored
如果一个陈述的形式是[atom 1] = {[atom or statement 1] ... [atom or statement n]},我们将[atom 1]称为satement的头部和[atom or statement 1 ] ... [原子或陈述n]陈述的主体。
在=之前和之后,{和}可以有一个任意数字(可能是0)的空格字符。 在两个连续的原子之间必须至少有一个空格字符,但可以是任何高于该数字的数字。
因此,下面示例中的两个表达式any_realm_lord = {...}和any_realm_lord = {...}是有效的,它们之间唯一的语法区别是使用any_realm_lord / any_province_lord作为每个语句的头部。
#Example file
#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag}
} any_province_lord={any_character = { #some comment
limit = {#some other comment
same_realm = ROOT} set_character_flag =
my_flag
}
}#more text
一旦解释了,这就是我想用ruby做的事情(我将使用上面的示例文件来说明它)
1)打开一个文件,找到不在其他语句正文中的语句
(在示例中,我希望它找到any_realm_character = {...}和any_province_character = {...}语句)
2)迭代位于1)中的语句,并选择其头部与某个字符串匹配的语句。如果匹配位于还有其他原子或语句的行中,请将它们分开。从现在开始,我将引用其头部与字符串匹配的语句为"目标语句"。
(说要匹配的字符串是" any_province_lord"。在此步骤之后,文件将如下所示:
#Example file
#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag}
}
any_province_lord={any_character = { #some comment
limit = {#some other comment
same_realm = ROOT} set_character_flag =
my_flag
}
}#more text
)
3)在目标语句的头部所在的行上方创建一个空行,并在目标语句所包含的行中剪切并粘贴任何注释
(
#Example file
#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag}
}
#some comment#some other comment
any_province_lord={any_character = {
limit = {
same_realm = ROOT} set_character_flag =
my_flag
}
}#more text
)
4)如果目标语句的右括号与另一个原子或语句位于同一行,则在右括号后添加\ n
(
#Example file
#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag}
}
#some comment#some other comment
any_province_lord={any_character = {
limit = {
same_realm = ROOT} set_character_flag =
my_flag
}
}
#more text
)
5)删除目标语句的主体(但不删除括号),并在我已经定义的括号之间添加新内容,间距很小。 (
#Example file
#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag}
}
#some comment#some other comment
any_province_lord={
#my predefined content will be here
}
#more text
)
那么在效率方面这样做最好的方法是什么?我需要我的程序来完成超过一千个文件(每个文件的平均大小为500Kb)。我对Ruby很新,所以我还在弄清楚这些东西是否最好在效率方面使用read,readlines或readline。 你觉得怎么样?
我希望我已经清楚地解释了我需要什么,而不是太不必要的冗长