Shell 如果某个字符串前面没有特定的字符串,则用另一个字符串替换该字符串
如何使用shell脚本将多个文件中的“if”替换为“abc if”。但我不想改变,如果它之前有其他 例如: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.
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
和$/
以及正则表达式替换修饰符