On Oct 16, 2007, at 8:50 PM, Ben Giddings wrote: > On Oct 16, 2007, at 08:59, Vidya Vidya wrote: >> for sample1 records:(this is one file) >> >> LIN*EDIA000005*000000570*570~ >> LIN*EDIA000006*000000570*570~ >> LIN*EDIA000007*000000570*570~ // here i want to remove ~ in the >> looping >> procees >> >> sample 2: >> >> >> LIN*EDIA000008*000000570*570~ >> LIN*EDIA000009*000000570*570~ >> LIN*EDIA000002*000000570*570~ // here i want to remove ~ in the >> looping >> procees > > Do you want to remove all the tilde (~) characters, or just the > last one before "procees"? > > Do you want the output to be like the following? > > LIN*EDIA000005*000000570*570~ > LIN*EDIA000006*000000570*570~ > LIN*EDIA000007*000000570*570 > procees > > If so, and if you have enough space for two of the files, the > easiest way is probably to open an "output" file and read from the > input file, but read ahead slightly, so you know when you're at the > next record, something like: > > prev_record = nil > File.open("output.txt", "w") do |out| > File.foreach("records.txt") do |record| > if prev_record > if /procees/.match(line) > out.puts prev_record.gsub(/~$/, "") > else > out.puts prev_record > end > end > prev_record = record > end > out.puts prev_record # since we were one-line behind at the end > end > > FileUtils.mv("output.txt", "records.txt") > > Ben > > chop could be useful here. 2 chops and a + as you iterate each line: line.chop!.chop! + "\n" (assuming you still want the newline on each line) Of course this is a quicka and dirty approach, assuming that every record ends with '~\n'