编辑:要在没有 GNU awk 的情况下将输出保存到 Input_file(s) 本身中,请尝试以下操作(但请确保运行我的第一个解决方案以查看输出是否为看起来正确)。
假设我们有脚本的值需要更改。
-rw-rw-r-- 1 ubuntu ubuntu 83 Dec 8 14:34 file2.ksh
-rw-rw-r-- 1 ubuntu ubuntu 83 Dec 8 14:34 file1.ksh
我们的awk 脚本的名称是script.ksh,以确保该脚本不会受到自己的关注 :)
cat script.ksh
awk '
FNR==1{
close(out)
out="out"++count
rename=(rename?rename ORS:"") "mv " out OFS FILENAME
}
match($0,/\$[0-9]+/){
before=substr($0,1,RSTART)
value=substr($0,RSTART+1,RLENGTH)
rest=substr($0,RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest > (out)
}
END{
if(rename){
system(rename)
}
}
' file*sh
现在,当我们通过 ./script.ksh 运行上述脚本时,我们可以看到名为 file1.ksh 的文件之一,现在其内容已更改如下。
之前:
cat file1.ksh
hv_bus_date="CAST('$1' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=$2
hv_act_id=$3
之后:
cat file1.ksh
hv_bus_date="CAST('$2' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=$3
hv_act_id=$4
第一个解决方案:考虑到您的脚本名称以 .sh 扩展名结尾,并且这不会将输出保存到 Input_file(s),您能否尝试以下操作,它会在终端上打印输出,仅供您检查输出是否正常。
awk '
match($0,/\$[0-9]+/){
before=substr($0,1,RSTART)
value=substr($0,RSTART+1,RLENGTH)
rest=substr($0,RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest
}
' *sh
第二个解决方案(仅使用较新版本的 GNU awk):一旦您对上述命令的结果感到满意,并且如果您有 gawk 命令,请尝试以下操作,这应该将输出保存到 Input_file(s) 本身。恕我直言,这需要gawk 4.1.0 + 版本。
awk -i inplace -v INPLACE_SUFFIX=.bak '
match($0,/\$[0-9]+/){
before=substr($0,1,RSTART)
value=substr($0,RSTART+1,RLENGTH)
rest=substr($0,RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest
}
' *sh