Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Programming languages 查找并替换文本文件目录中的单词_Programming Languages_Replace - Fatal编程技术网

Programming languages 查找并替换文本文件目录中的单词

Programming languages 查找并替换文本文件目录中的单词,programming-languages,replace,Programming Languages,Replace,我正在为独立游戏开发一个mod的最后阶段。在mod正常工作之前,最后需要做的事情是检查并修改矮人堡垒的RAW——大约24个文本文件,其中包含了游戏中数百种生物的信息 从技术角度来看,这相当于遍历一个文本文件目录,基本上执行“查找并替换”操作来更改每一行 我的大部分编程经验都是使用面向对象语言——C#和Java,还有一些使用汇编语言和C的经验。然而,这些语言似乎都不适合这种任务 在一个非常简单的替换中,有一个问题是,由于矮人堡垒RAW的编写方式,我不知道是否需要替换该行,直到文本文件的下一步。下面

我正在为独立游戏开发一个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]行之后
根据我的编码经验,我最接近可行的想法是编写一个C程序来读取文件,使用指针“保存”读取行的位置,并在文件读取器检测到新RAW开始时更改它们

然而,这给我的印象是不雅观,并且遇到了一个麻烦,我没有在C(或任何语言)中实现find/replace函数的经验

有没有更简单的方法来完成手工浏览每个文本文件这项单调的任务?我完全愿意学习一种新的编程语言,但我不知道哪种语言最容易处理这种情况

建议?

使用

那将是小菜一碟。

使用


那是小菜一碟。

好的。我之前问这些问题的原因是我想知道要替换的行的上下文是否重要。因为如果上下文不重要,那么整个递归替换过程将主要是一个单行程序

根据你的回答,我认为需要考虑到上下文。下面是一个简化的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-是的,我认为脚本语言可以工作,但我没有脚本语言的经验,因此问题就来了。问题是需要替换的不是乘法行