Ruby regex gsub文本文件中的一行

Ruby regex gsub文本文件中的一行,ruby,regex,gsub,Ruby,Regex,Gsub,我需要匹配一个输入文本文件字符串中的一行,并用一个字符包装捕获的行 例如,将文本文件想象成这样: test foo test bar 我想使用gsub输出: XtestX XfooX XtestX XbarX 不过,我在匹配线路时遇到了问题。我尝试过使用以“^”开头,以$结尾的正则表达式,但它似乎不起作用。有什么想法吗 我有一个文本文件,其中包含以下内容: test foo test bag 文本文件正在作为命令行参数读入 所以我得到了 string = IO.read(ARGV[0])

我需要匹配一个输入文本文件字符串中的一行,并用一个字符包装捕获的行

例如,将文本文件想象成这样:

test
foo
test
bar
我想使用gsub输出:

XtestX
XfooX
XtestX
XbarX
不过,我在匹配线路时遇到了问题。我尝试过使用以“^”开头,以$结尾的正则表达式,但它似乎不起作用。有什么想法吗

我有一个文本文件,其中包含以下内容:

test
foo
test
bag
文本文件正在作为命令行参数读入

所以我得到了

string = IO.read(ARGV[0])
string = string.gsub(/^(test)$/,'X\1X')

puts string
它输出的内容与文本文件中的内容完全相同。

string.gsub(/^(匹配线)$/,'X\1X')
使用反向引用(\1)获取正则表达式的第一个捕获组,并用X将其包围

例如:

string = "test\nfoo\ntest\nbar"
string.gsub!(/^test$/, 'X\&X')
p string
=> "XtestX\nfoo\nXtestX\nbar"

如果您的文件是
input.txt
,我将执行以下操作

File.open("input.txt") do |file|
  file.lines.each do |line|
    puts line.gsub(/^(.*)$/, 'X\1X')
  end
end
 File.read("input.txt").gsub(/^(.*)$/, 'X\1X')
  • (.*)
    允许捕获任何字符并使其成为变量Regexp
  • 字符串替换中的
    \1
    是捕获的组
如果您更喜欢在整个内容的一行中完成,您可以按以下方式完成

File.open("input.txt") do |file|
  file.lines.each do |line|
    puts line.gsub(/^(.*)$/, 'X\1X')
  end
end
 File.read("input.txt").gsub(/^(.*)$/, 'X\1X')
如果你想匹配每一行,那么

gsub(/^.*$/, 'X\&X')
这就是诀窍。如果您只想匹配某些行,则用所需的内容替换
*

更新:

用我的替换你的
gsub

string = IO.read(ARGV[0])
string = string.gsub(/^.*$/, 'X\&X')
puts string
我得到:

$ gsub.rb testfile XtestX XfooX XtestX XbarX 这对我来说同样有效。我对正则表达式中的
^
$
的理解是不需要咀嚼,但可能我错了。

咀嚼行结尾 您的行可能有换行符。你需要以这样或那样的方式处理这件事。例如,这对我来说很好:

$ ruby -ne 'puts "X#{$_.chomp}X"' /tmp/corpus
XtestX
XfooX
XtestX
XbarX

您可以在一行中这样做:

IO.write(filepath, File.open(filepath) {|f| f.read.gsub(//<appId>\d+<\/appId>/, "<appId>42</appId>"/)})

欢迎来到堆栈溢出。请通过发布您应用于问题的一些代码和所有相关错误消息来改进您的问题。请使用单词边界,例如
\b
请参见,例如,我尝试了string.gsub(/^(test)$/,'X\1X'),但它不起作用。这就是我遇到的问题?也许你没有包括!,在gsub的末尾!要将其应用到位,请尝试
p string.gsub(/^(test)$/,'X\1X')
My text file作为命令行参数通过IO读入。它是否自动将\n放入其中?因为正则表达式不起作用。如果您直接从argf读取,可能需要对其使用.read方法,这是有效的:问题在于您的字符串输入,请向我们显示您正在解析的确切字符串以查找问题。(
print IO.read(ARGV[0])
)那么您是说不能在单个字符串中匹配行…?@Tommy是的,这是可能的。如果您希望对整个内容执行此操作,我添加了另一个选项。此选项是否可以将文本文件作为命令行参数使用?是的,它可以:
put file.read(ARGV[0]).gsub(/^(.*)$/,'X\1X')
和do
ruby your_script.rb input.txt
。是的。请发布您实际使用的代码。如果您将您的
gsub
替换为我的,它会工作。我刚试过,不,没有。它输出Xtest Xfoo XbarXtest@Tommy您的代码中有:
.gsub(/^(test)$/,'X\1X')
而不是
.gsub(/^.*$/,'X\&X')
作为@darshan的代码。请注意,
X\1X
vs
X\&X
两种方法都不起作用\1匹配括号中的任何内容。