awk-检查文件是否包含特定字符串-是否找到并替换另一个字符串

awk-检查文件是否包含特定字符串-是否找到并替换另一个字符串,awk,sed,Awk,Sed,我有一个这样的文件: COD:'Anschlag 15' LET: DimX(2240) LET: DimZ(1193) LET: DimS(1.25) LET: Schenkel(96) DIM: X DimX+0.5 Z DimZ+0.5 S DimS STAINLESS REF: X1 FOD-107.69 X2 FOD-107.69 Z1 FOD Z2 FOD N ZPF 40

我有一个这样的文件:

COD:'Anschlag 15'

LET: DimX(2240)
LET: DimZ(1193)
LET: DimS(1.25)
LET: Schenkel(96)


DIM: X DimX+0.5
     Z DimZ+0.5
     S DimS
     STAINLESS
     
REF: X1  FOD-107.69
     X2  FOD-107.69  
     Z1  FOD
     Z2  FOD
     N
ZPF 40
     
MCM: QSU 10 QSD 10
     MNP_SPEED 20

     BLHINH 50
ROT: S 4 ROTONBLH   SPEED 20
    BEN: L 15       AC -1           
    BEN: L Schenkel AC -1
ROT: S 2  ROTONBLH SPEED 20          
    BEN: L 15       AC -1           
    BEN: L Schenkel AC -1               
        
ROT: S 1  ROTONBLH SPEED 20          
    BEN: L 15       AC -1           
    BEN: L Schenkel AC -1                            

 
                                    
ROT: S 3  ROTONBLH SPEED 20          
    BEN-: L 15      AC -1           
    BEN: L 107  AC -1       
        
END: SPEED 40
我想检查文件是否包含字符串

if it does search for all occurences of AC -1 and replace them with AC 3
if it doesn't contain STAINLESS keep the file as it is
如果有 搜索AC-1的所有出现,并将其替换为AC 3 如果它不含不锈钢 保持文件原样 我试过的是:

find C:/Users/user/test -type f -exec awk -i inplace -f C:/Users/user/test_skript/b.awk {} +
文件b.awk

$1 == "STAINLESS" { f = 1 }
if ( f == 1 )
{ gsub(/AC[[:blank:]]*-1/,"AC 3"); print }
else
{ print }

gsub函数本身可以工作。但是不锈钢支票没有。

对于您展示的样品,请您尝试以下内容,并用GNU awk书写和测试。无论AC-1之前或之后是不锈钢字,这都应该有效

awk '
FNR==NR{
  if($0~/STAINLESS/){ found=1 }
  next
}
found{
  gsub(/AC -1/,"AC 3")
}
1
' Input_file Input_file
说明:增加对以上内容的详细说明

awk '                               ##Starting awk program from here.
FNR==NR{                            ##Checking condition which will be TRUE when first time Input_file is being read.
  if($0~/STAINLESS/){ found=1 }     ##Checking condition if line contains STAINLESS then set found to 1 here.
  next                              ##next will skip all further statements from here.
}
found{                              ##Checking condition if found is SET then do following.
  gsub(/AC -1/,"AC 3")              ##Globally substituting AC -1 with AC 3 here.
}
1                                   ##Mentioning 1 will print line here.
' Input_file Input_file             ##Mentioning Input_file names here.

注意:如果您有GNU awk,请将if$0~/sustalish/{found=1}更改为if$0~/sustalish/{found=1;nextfile},以使其在运行时间方面更快。

对于所显示的示例,您是否可以尝试使用GNU awk编写和测试以下内容。无论AC-1之前或之后是不锈钢字,这都应该有效

awk '
FNR==NR{
  if($0~/STAINLESS/){ found=1 }
  next
}
found{
  gsub(/AC -1/,"AC 3")
}
1
' Input_file Input_file
说明:增加对以上内容的详细说明

awk '                               ##Starting awk program from here.
FNR==NR{                            ##Checking condition which will be TRUE when first time Input_file is being read.
  if($0~/STAINLESS/){ found=1 }     ##Checking condition if line contains STAINLESS then set found to 1 here.
  next                              ##next will skip all further statements from here.
}
found{                              ##Checking condition if found is SET then do following.
  gsub(/AC -1/,"AC 3")              ##Globally substituting AC -1 with AC 3 here.
}
1                                   ##Mentioning 1 will print line here.
' Input_file Input_file             ##Mentioning Input_file names here.
注意:如果您有GNU awk,也可以将if$0~/sustalish/{found=1}更改为if$0~/sustalish/{found=1;nextfile},以使其在运行时间方面更快。

如果sustalish始终位于AC-1之前,则以下单通awk应起作用:

awk'/sustash/{f=1}f{gsub/AC-1/,ac3}1'文件 如果不锈钢总是在AC-1之前出现,则以下单道awk应起作用:

awk'/sustash/{f=1}f{gsub/AC-1/,ac3}1'文件
如果搜索字符串不在替换字符串之前,则使用grep/sed对更容易


如果搜索字符串不在替换字符串之前,则使用grep/sed对更容易


以下内容基于OPs要求:

我想检查文件是否包含字符串

if it does search for all occurences of AC -1 and replace them with AC 3
if it doesn't contain STAINLESS keep the file as it is
因此:

在将AC-1替换为AC 3之前,在文件中的任何位置搜索整个文件中的不锈钢-在不锈钢之前、之后或在不锈钢的同一行上。 如果文件中不存在不锈钢,将保持文件的原样,即根本不向其写入,因此不会更改文件的时间戳、所有权或权限。 由于您是在具有inplace编辑的查找上下文中使用它的,因此您需要使用GNU awk for-i inplace、nextfile和ENDFILE这样的内容:

这个\;在find命令的末尾不使用+是很重要的,因此awk只需一次输入一个文件,就可以轻松地对每个文件执行两次操作,首先查找不锈钢,然后如果在第一次操作中找到,则进行替换


请注意,我们需要在前一个文件的ENDFILE部分为即将到来的文件设置启用标志,因为为即将到来的文件执行BegnFile时已经太晚了,已经为该文件建立了就地编辑,因此如果您在Beginfle awk中执行打印foo,则知道将其定向到何处。

以下内容基于OPs要求:

我想检查文件是否包含字符串

if it does search for all occurences of AC -1 and replace them with AC 3
if it doesn't contain STAINLESS keep the file as it is
因此:

在将AC-1替换为AC 3之前,在文件中的任何位置搜索整个文件中的不锈钢-在不锈钢之前、之后或在不锈钢的同一行上。 如果文件中不存在不锈钢,将保持文件的原样,即根本不向其写入,因此不会更改文件的时间戳、所有权或权限。 由于您是在具有inplace编辑的查找上下文中使用它的,因此您需要使用GNU awk for-i inplace、nextfile和ENDFILE这样的内容:

这个\;在find命令的末尾不使用+是很重要的,因此awk只需一次输入一个文件,就可以轻松地对每个文件执行两次操作,首先查找不锈钢,然后如果在第一次操作中找到,则进行替换


请注意,我们需要在前一个文件的ENDFILE部分为即将到来的文件设置启用标志,因为为即将到来的文件执行BegnFile时已经太晚了,已经为该文件建立了就地编辑,因此如果您在Beginfle awk中打印foo,awk知道将其指向何处。

不锈钢将始终位于AC-1之前吗?是的,它将始终位于AC-1之前如果任何解决方案对您有效,请查看下一步操作。不锈钢将始终位于AC-1之前吗?是的,它总是会出现在AC-1之前,如果任何解决方案对你有效,那么看看下一步该怎么做。