Programming languages 查找并替换文本文件目录中的单词
我正在为独立游戏开发一个mod的最后阶段。在mod正常工作之前,最后需要做的事情是检查并修改矮人堡垒的RAW——大约24个文本文件,其中包含了游戏中数百种生物的信息 从技术角度来看,这相当于遍历一个文本文件目录,基本上执行“查找并替换”操作来更改每一行 我的大部分编程经验都是使用面向对象语言——C#和Java,还有一些使用汇编语言和C的经验。然而,这些语言似乎都不适合这种任务 在一个非常简单的替换中,有一个问题是,由于矮人堡垒RAW的编写方式,我不知道是否需要替换该行,直到文本文件的下一步。下面是一个简化的示例场景Programming languages 查找并替换文本文件目录中的单词,programming-languages,replace,Programming Languages,Replace,我正在为独立游戏开发一个mod的最后阶段。在mod正常工作之前,最后需要做的事情是检查并修改矮人堡垒的RAW——大约24个文本文件,其中包含了游戏中数百种生物的信息 从技术角度来看,这相当于遍历一个文本文件目录,基本上执行“查找并替换”操作来更改每一行 我的大部分编程经验都是使用面向对象语言——C#和Java,还有一些使用汇编语言和C的经验。然而,这些语言似乎都不适合这种任务 在一个非常简单的替换中,有一个问题是,由于矮人堡垒RAW的编写方式,我不知道是否需要替换该行,直到文本文件的下一步。下面
[CREATURE:WOLF]
...
[Many irrelevant lines of tokens]
...
[BODY_DETAIL_PLAN:STANDARD_MATERIALS]
[BODY_DETAIL_PLAN:STANDARD_TISSUES]
...
[Many more irrelevant lines of tokens]
...
[MULTIPLY_VALUE:2]
我希望编写的程序需要能够读取[MULTIPLY_VALUE:X]行,然后返回并将包含[BODY_DETAIL_PLAN:Z]的两行替换为[BODY_DETAIL_PLAN:Y],其中Y根据X的读取值而变化
我可以保证两件事:
- 在[生物:A]和[生物:B]或[生物:Z]和文件结尾之间最多出现一行[乘法值:X]
- 如果该生物上有[MULTIPLY_VALUE:X]行,则该行将始终位于[BODY_DETAIL_PLAN:Z]行之后
那是小菜一碟。好的。我之前问这些问题的原因是我想知道要替换的行的上下文是否重要。因为如果上下文不重要,那么整个递归替换过程将主要是一个单行程序 根据你的回答,我认为需要考虑到上下文。下面是一个简化的Ruby示例。作为一个例子,你可以看到它是如何工作的。代码有点冗长,可以帮助您更好地理解它。你可以把它作为基地,从那里开始工作 程序的工作原理是这样的——假设您有一个数据文件
data.txt
,如下所示:
[aaa]
[bbb]
[replace:a]
[replace:b]
[start_marker]
[xxx]
[replace:x]
[replace:y]
[yyy]
[end_marker]
[replace:c]
[replace:d]
[ccc]
[ddd]
您运行该程序:
ruby replace.rb data.txt
最后,您得到了原始数据的data.txt.bak
,以及替换后的data.txt
,如下所示:
[aaa]
[bbb]
[replace:a]
[replace:b]
[start_marker]
[xxx]
[replace:x was replaced!]
[replace:y was replaced!]
[yyy]
[end_marker]
[replace:c]
[replace:d]
[ccc]
[ddd]
程序replace.rb
:
require 'rubygems'
require 'ftools' # File.move
require 'extensions/io' # File.writelines
file = ARGV.shift
lines = File.open(file).readlines
replace_these = Array.new
within_section = false
# Loop until we hit start_marker, then store potential
# lines until we hit end_marker, then fix the lines
lines.each { |line|
within_section = true if line.match /\[start_marker\]/
if line.match /\[end_marker\]/
within_section = false
replace_these.each { |line|
# Do something clever...
line.gsub!(/:(\w+)/, ':\1 was replaced!')
}
replace_these = Array.new
end
next if !within_section
# Store lines to be replaced for later processing
replace_these << line if line.match /\[replace:.*\]/
}
# Make a backup of the original file
File.move(file, "#{file}.bak")
# Overwrite the original with the new data
File.writelines(file, lines)
需要“rubygems”
需要“ftools”#File.move
需要“扩展名/io”#File.writelines
file=ARGV.shift
lines=File.open(File.readlines)
替换这些=Array.new
在_段内=假
#循环直到我们点击开始标记,然后存储电位
#线,直到我们到达末端标记,然后修复线
行。每个{行|
如果line.match/\[start\u marker\]/
如果line.match/\[结束标记\]/
在_段内=假
替换这些{124;行|
#做点聪明的事。。。
行.gsub!(/:(\w+/,“:\1已被替换!”)
}
替换这些=Array.new
结束
下一个if!在_部分内
#存储要替换的行以供以后处理
替换这些好的..我之前问这些问题的原因是我想知道要替换的行的上下文是否重要。因为如果上下文不重要,那么整个递归替换将主要是一行程序
根据您的回答,我假设需要考虑上下文。因此,这里有一个Ruby的简化示例。作为一个示例,您可以看到它是如何工作的。代码有点冗长,可以帮助您更好地理解它。您可以将其用作基础并从那里开始工作
程序的工作原理是这样的——假设您有一个数据文件data.txt
,如下所示:
[aaa]
[bbb]
[replace:a]
[replace:b]
[start_marker]
[xxx]
[replace:x]
[replace:y]
[yyy]
[end_marker]
[replace:c]
[replace:d]
[ccc]
[ddd]
您运行该程序:
ruby replace.rb data.txt
最后,您得到了原始数据的data.txt.bak
,以及替换后的data.txt
,如下所示:
[aaa]
[bbb]
[replace:a]
[replace:b]
[start_marker]
[xxx]
[replace:x was replaced!]
[replace:y was replaced!]
[yyy]
[end_marker]
[replace:c]
[replace:d]
[ccc]
[ddd]
程序replace.rb
:
require 'rubygems'
require 'ftools' # File.move
require 'extensions/io' # File.writelines
file = ARGV.shift
lines = File.open(file).readlines
replace_these = Array.new
within_section = false
# Loop until we hit start_marker, then store potential
# lines until we hit end_marker, then fix the lines
lines.each { |line|
within_section = true if line.match /\[start_marker\]/
if line.match /\[end_marker\]/
within_section = false
replace_these.each { |line|
# Do something clever...
line.gsub!(/:(\w+)/, ':\1 was replaced!')
}
replace_these = Array.new
end
next if !within_section
# Store lines to be replaced for later processing
replace_these << line if line.match /\[replace:.*\]/
}
# Make a backup of the original file
File.move(file, "#{file}.bak")
# Overwrite the original with the new data
File.writelines(file, lines)
需要“rubygems”
需要“ftools”#File.move
需要“扩展名/io”#File.writelines
file=ARGV.shift
lines=File.open(File.readlines)
替换这些=Array.new
在_段内=假
#循环直到我们点击开始标记,然后存储电位
#线,直到我们到达末端标记,然后修复线
行。每个{行|
如果line.match/\[start\u marker\]/
如果line.match/\[结束标记\]/
在_段内=假
替换这些{124;行|
#做点聪明的事。。。
行.gsub!(/:(\w+/,“:\1已被替换!”)
}
替换这些=Array.new
结束
下一个if!在_部分内
#存储要替换的行以供以后处理
替换\u对于Perl、Python或Ruby等脚本语言来说,这似乎是一项完美的任务。这些语言在早餐时都会做类似的事情。但有一个问题……文件中的其他地方是否会有乘法行?也就是说,您是否需要智能在生物段中找到它,或者您是否可以对任何乘法进行盲替换整个文件中的行?@Casper-是的,我认为脚本语言可以工作,但我没有脚本语言的经验,因此问题就来了。问题是需要替换的不是乘法行