Shell 如果某个字符串前面没有特定的字符串,则用另一个字符串替换该字符串

Shell 如果某个字符串前面没有特定的字符串,则用另一个字符串替换该字符串,shell,unix,awk,sed,Shell,Unix,Awk,Sed,如何使用shell脚本将多个文件中的“if”替换为“abc if”。但我不想改变,如果它之前有其他 例如: if (var3 == 4'h0) a = bvec[0]; else if (var3 == 4'h1) a = bvec[1]; 应转换为 abc if (var3 == 4'h0) a = bvec[0]; else if (var3 == 4'h1) a = bvec[1]; 请注意: 1.在else和if之间可能有不确定的空格或新行。 2.

如何使用shell脚本将多个文件中的“if”替换为“abc if”。但我不想改变,如果它之前有其他

例如:

if (var3 == 4'h0)
   a =    bvec[0];
else
if (var3 == 4'h1)
a =    bvec[1];
应转换为

abc if (var3 == 4'h0)
   a =    bvec[0];
else
if (var3 == 4'h1)
a =    bvec[1];
请注意: 1.在else和if之间可能有不确定的空格或新行。 2.文件中还存在更多代码 3.我只希望更改发生在同一个文件中。 4.我想将文件名列表传递给脚本

我试过:

sed -r 's/else[[:blank:]]if/temp1/g;s/if/abc if/g;s/temp1/else if/g' file.v

下面是一个如何在Perl中模拟负变量lookbehind regex的示例:

#! /usr/bin/env perl

use strict;
use warnings;

my $str = do { local $/; <> };
$str =~ s/((?:else\s*if|if))/my_subst($1)/ge;
print $str;

sub my_subst {
    my $res = $_[0];
    if ( $_[0] !~ /^else/ ) {
        $res = "abc if";
    }
    return $res;
}
更新

$ p.pl file.txt 
abc if (var3 == 4'h0)
   a =    bvec[0];
else
if (var3 == 4'h1)
a =    bvec[1];
要在文件列表上使用在位编辑,请执行以下操作:

$^I = '.bak';
$/ = undef;
while (<>) {
    s/((?:else\s*if|if))/my_subst($1)/ge;
    print;
}
$^I='.bak';
$/=未定义;
而(){
s/((?:else\s*if | if))/my_subst($1)/ge;
印刷品;
}

然后,您只需运行
p.pl file*.txt
,备份文件将获得
.bak
后缀。

,GNU awk用于多字符、gensub()和字边界:

$ awk -v RS='^$' -v ORS= '{
    gsub(/@/,"@A")
    gsub(/#/,"@B")
    $0 = gensub(/\<else(\s+)if\>/,"#\\1#","g")
    gsub(/\<if\>/,"abc &")
    $0 = gensub(/#(\s+)#/,"else\\1if","g")
    gsub(/@B/,"#")
    gsub(/@A/,"@")
    print
}' file
abc if (var3 == 4'h0)
   a =    bvec[0];
else
if (var3 == 4'h1)
a =    bvec[1];
$awk-vrs='^$'-vrs='{
gsub(/@/,“@A”)
gsub(/#/,“@B”)
$0=gensub(/\/,“\\\1”,“g”)
gsub(/\/,“abc&”)
$0=gensub(/#(\s+)/,“else\\1if”,“g”)
gsub(/@B/,“#”)
gsub(/@A/,“@”)
打印
}"档案"
abc if(var3==4'h0)
a=bvec[0];
其他的
如果(var3==4'h1)
a=bvec[1];

之间是否有换行符?是否有更长的代码,例如a
{…;…;;…;}
?好的,那么您对问题的尝试是什么?“我想做X”这不是问题。请您更新代码,使更改仅在同一个文件中生效,并且我想传递一个文件名列表,我想在其中进行这些更改。@JayeshRanjan您可以使用
将输出重定向到终端中的一个文件,因为我想传递的文件中有一个文件名列表。无法使用>能否请您解释一下脚本中使用的内容参见
$^I
$/
以及正则表达式替换修饰符