String 搜索字符串的前面以替换字符串的结尾

String 搜索字符串的前面以替换字符串的结尾,string,perl,replace,split,String,Perl,Replace,Split,在得到一些帮助后,我想到了这一点(我希望通过尝试将多个脚本组合在一起来学习)。下面的脚本将执行HW和OW替换,但不运行if语句 *#*!/usr/bin/perl use strict; use warnings 'all'; $^I = '.bak'; # create a backup copy while (<>) { s/HW/HT/g; # do the replacement of HW with HT s/OW/OT/g; # do a secon

在得到一些帮助后,我想到了这一点(我希望通过尝试将多个脚本组合在一起来学习)。下面的脚本将执行HW和OW替换,但不运行if语句

*#*!/usr/bin/perl  
use strict;  
use warnings 'all';
$^I = '.bak'; # create a backup copy 
while (<>) {
   s/HW/HT/g; # do the replacement of HW with HT
   s/OW/OT/g; # do a second replacement OW with OT
*#* Hopefully run the if statement       
   my @parts = /\s*\S+/g;
   if ( $parts[1] =~ s/([HO])W/$1T/ ) {
    $parts[5] = sprintf '%*d',
            length $parts[5],
            $parts[1] =~ /HT/ ? 2002 : 2001;
      }
print @parts, "\n";
}
我想使用
HT
作为搜索,并且能够用
2002
替换零列中的“0”。我知道如何替换整列零,但我不知道如何使其特定于行。使用HT作为搜索后,我需要搜索
OT
,并将
0
列替换为
2001

基本上,我需要搜索一个识别行的字符串,并替换该行的特定字符串,而其中的文本是可变的。需要将输出打印到新的_file.xyz。我也会在很多文件上重复这样做。 谢谢你的帮助

下面是我正在使用的python代码,但无法理解如何使“file.txt”成为一个变量,以接受在命令之后键入的文件。这段代码要求我每次使用文件时都将“file.txt”更改为文件名。我也无法将其打印到新文件中

python代码:

#!/usr/bin/python

with open('file.txt') as f:
    lines = f.readlines()
    new_lines = []
    for line in lines:
        if "HT" in line:
            new_line = line.replace(' 0 ', '2002')
            new_lines.append(new_line)
        else:
            new_lines.append(line)
    content = ''.join(new_lines)
    print(content)
我已经能够用Perl做一些工作,并且希望有一个脚本可以按顺序执行所有替换步骤,因为所有的
HT
都以
HW
开头,所有的
OT
都以
OW
开头。 Perl脚本:

#!/usr/bin/perl

use strict;
use warnings;

$^I = '.bak'; # create a backup copy 

while (<>) {
   s/HW/HT/g; # do the replacement
   s/OW/OT/g; # do a second replacement
   print; # print to the modified file
}
#/usr/bin/perl
严格使用;
使用警告;
$^I='.bak'#创建备份副本
而(){
s/HW/HT/g;#进行更换
s/OW/OT/g;#进行第二次更换
打印;#打印到修改后的文件
}
谢谢你的帮助。

哦,不幸的是,我仅限于使用Python2.7,因为有人建议使用Python3.0的代码。我纯粹是一个大学集群的用户,但我会询问升级python的问题。

它似乎使用了固定宽度的字段,所以

sub trim { $_[0] =~ s/^\s+//r =~ s/\s+\z//r }

while (<>) {
   my $code = trim(substr($_, 2, 4));
   if ($code eq "HW") {
      substr($_,  2, 4, "  HT");
      substr($_, 43, 6, "  2002");
   }
   elsif ($code eq "OW") {
      substr($_,  2, 4, "  OT");
      substr($_, 43, 6, "  2001");
   }

   print;
}
sub-trim{$\u0]=~s/^\s+//r=~s/\s+\z//r}
而(){
my$code=trim(substr($,2,4));
如果($code eq“HW”){
substr($_,2,4,“HT”);
substr(美元,43,6,2002);;
}
elsif($code eq“OW”){
substr($,2,4,“OT”);
substr($),43,6,“2001”);
}
打印
}

清洁剂:

sub parse {
   my ( @format, @row );
   while ($_[0] =~ /\G\s*(\S+)/g) {
      push @row, $1;
      push @format, '%'.( $+[0] - $-[0] ).'s';
   }
   return ( join('', @format)."\n", @row );
}

while (<>) {
   my ($format, @row) = parse($_);

   if    ($row[1] eq "HW") { $row[1] = "HT";  $row[5] = 2002; }
   elsif ($row[1] eq "OW") { $row[1] = "OT";  $row[5] = 2001; }

   printf($format, @row);
}
子解析{
我的(@格式,@行);
而($\u[0]=~/\G\s*(\s+)/G){
按@行,$1;
推送@format,“%”($+[0]-$-[0])。's';
}
返回(联接(“”,@format)。“\n”,@row);
}
而(){
我的($format,@row)=解析($);
如果($row[1]eq“HW”){$row[1]=“HT”;$row[5]=2002;}
elsif($row[1]eq“OW”){$row[1]=“OT”;$row[5]=2001;}
printf($format,@row);
}
更新 因此,您真正想要做的是将第二列中的所有
HW
更改为
HT
,将
OW
更改为
OT
,并将第六列更改为2001(如果是
OW
),将
HW
更改为2002

看起来像这样

使用严格;
使用“全部”警告;
而(){
我的@parts=/\s*\s+/g;
如果($parts[1]=~s/([HO])W/$1T/){
$parts[5]=sprintf“%$d”,
长度$parts[5],
$1等分‘H’?2002年:2001年;
}
打印@parts,“\n”;
}
__资料__
6 HW 4.092000 4.750000-0.502000 05 7
7 HW 5.367000 5.548000-0.325000 0 5 6
8 OW-5.470000 5.461000 1.463000 0 9 10
9 HW-5.167000 4.571000 1.284000 0 8 10
10 HW-4.726000 6.018000 1.235000 0 8 9
11 OW-4.865000-5.029000-3.915000 0 12 13
12 HW-4.758000-4.129000-3.608000 0 11 13
输出
6 HT 4.092000 4.750000-0.502000 2002 5 7
7 HT 5.367000 5.548000-0.325000 2002 5 6
8 OT-5.470000 5.461000 1.463000 2001 9 10
9 HT-5.167000 4.571000 1.284000 2002 8 10
10 HT-4.726000 6.018000 1.235000 2002 8 9
11 OT-4.865000-5.029000-3.915000 2001 12 13
12 HT-4.758000-4.129000-3.608000 2002 11 13


如果很重要,此解决方案会注意保持每条线内所有值的位置不变

通过检查第二个字段是否包含字符串
HT
OT
,选择要修改的行。考虑到你们提供的小数据样本,我不知道这是否足够

这是为了演示。我相信您能够在必要时修改代码以打开外部文件,并从
data

使用严格;
使用“全部”警告;
而(){
我的@parts=/\s*\s+/g;
如果($parts[1]=~/[HO]T/){
$parts[5]=sprintf“%$d”,
长度$parts[5],
$parts[1]=~/HT/?2002:2001;
}
打印@parts,“\n”;
}
__资料__
6 HT 4.092000 4.750000-0.502000 05 7
7 HT 5.367000 5.548000-0.325000 0 5 6
8 OT-5.470000 5.461000 1.463000 0 9 10
9 HT-5.167000 4.571000 1.284000 0 8 10
10 HT-4.726000 6.018000 1.235000 0 8 9
11 OT-4.865000-5.029000-3.915000 0 12 13
12 HT-4.758000-4.129000-3.608000 0 11 13
输出
6 HT 4.092000 4.750000-0.502000 2002 5 7
7 HT 5.367000 5.548000-0.325000 2002 5 6
8 OT-5.470000 5.461000 1.463000 2001 9 10
9 HT-5.167000 4.571000 1.284000 2002 8 10
10 HT-4.726000 6.018000 1.235000 2002 8 9
11 OT-4.865000-5.029000-3.915000 2001 12 13
12 HT-4.758000-4.129000-3.608000 2002 11 13

似乎要使用正则表达式来执行字符串替换。依我所见
sub parse {
   my ( @format, @row );
   while ($_[0] =~ /\G\s*(\S+)/g) {
      push @row, $1;
      push @format, '%'.( $+[0] - $-[0] ).'s';
   }
   return ( join('', @format)."\n", @row );
}

while (<>) {
   my ($format, @row) = parse($_);

   if    ($row[1] eq "HW") { $row[1] = "HT";  $row[5] = 2002; }
   elsif ($row[1] eq "OW") { $row[1] = "OT";  $row[5] = 2001; }

   printf($format, @row);
}
while (my $line = <>) {
    $line =~ s/(\s*)([HO])(T|W)(\s+\S+\s+\S+\s+\S+)(\s+\d+)/$1.$2.'T'.$4.($5 == 0 ? ($2 eq 'H' ? '  2002' : '  2001') : $5)/eg;
    print $line;
}