Linux 如何在bash脚本中使用sed进行更改

Linux 如何在bash脚本中使用sed进行更改,linux,bash,shell,Linux,Bash,Shell,下面是我的bash脚本。它接受一个源文件和一个令牌文件, 令牌文件包含servicename:usage 我必须在源文件中逐行查找servicename,如果找到了,则计算内存使用量,然后用-Xmx\d{1,3}m更改-xmxmxm。在下面的脚本中,粗体的线条解释了要做的事情 你们可以先从下面的小部分脚本了解这个问题 line="Superviser.childOpts:-Xmx128m" heapMB=750 line=($(echo $line|sed "s/${-Xmx\d{1,3}m

下面是我的bash脚本。它接受一个源文件和一个令牌文件, 令牌文件包含servicename:usage 我必须在源文件中逐行查找servicename,如果找到了,则计算内存使用量,然后用-Xmx\d{1,3}m更改-xmxmxm。在下面的脚本中,粗体的线条解释了要做的事情 你们可以先从下面的小部分脚本了解这个问题

line="Superviser.childOpts:-Xmx128m" heapMB=750 line=($(echo $line|sed "s/${-Xmx\d{1,3}m}/$-Xmx{$heapMB}m/g")) line=“Superviser.childOpts:-Xmx128m” heapMB=750 行=($(echo$line | sed“s/${-Xmx\d{1,3}m}/$-Xmx{$heapMB}m/g”)) 那么上面这一行有什么不对呢

#!/bin/bash
sourceFile=$1
tokenFile=$2
if [ -z $sourceFile ]
then
echo "Please provide a valid source file"
exit 0
fi
if [ -z $tokenFile ]
then
echo "Please provide a valid token file"
exit 0
fi
#read token file and tokenize with : to get service name at 0 index and percentage usages at 1
declare arr_token_name
declare arr_token_usage
count=0
while read line
do
#here line contain :percentage usages
OIFS="$IFS"
IFS=$':'
arr=($line)
IFS="$OIFS"
if [ ! -z $line ]
then
arr_token_name[$count]=${arr[0]}
arr_token_usage[$count]=${arr[1]}
count=`expr $count + 1`
fi
done # read source file line by line test with all the tokens
totalMemKB=$(awk '/MemTotal:/ { print $2 }' /proc/meminfo)
echo "total mem = $totalMemKB"
while read line
do
result_token_search=""
#for j in "${arr_token_name[@]}"
#do
# echo "index=$j"
#done
count2=0
for i in "${arr_token_name[@]}"
do
#here search token in line , if found
#calculate memory for this getting percent usage from arr_token_usage then use calculate frmula then device by 1024
#then replace -Xmx\d{1,5}m with -Xmx
echo "line1=$line"
result_token_search=$(echo $line|grep -P "$i")
if [ -n "$result_token_search" ]
then
percent_usage=${arr_token_usage[$count2]}
let heapKB=$totalMemKB*$percent_usage/100
let heapMB=$heapKB/1024
echo "before sed=$line"
line=($(echo $line|sed "s/${-Xmx\d{1,3}m}/$-Xmx{$heapMB}m/g"))
echo "new line=$line"
echo "token found in line $line , token = $i"
fi
result_token_search=""
count2=`expr $count2+1`
cat "$line" >> tmp.txt
done
done #!/bin/bash
sourceFile=$1
令牌文件=$2
如果[-z$sourceFile]
然后
echo“请提供有效的源文件”
退出0
fi
如果[-z$tokenFile]
然后
echo“请提供有效的令牌文件”
退出0
fi
#读取令牌文件并使用令牌化:获取索引为0的服务名称和1的使用百分比
声明arr\u令牌\u名称
声明arr\U令牌使用情况
计数=0
读行时

#此处行包含:百分比用法
OIFS=“$IFS”
IFS=$:'
arr=($line)
IFS=“$OIFS”
如果[!-z$行]
然后
arr\u令牌\u名称[$count]=${arr[0]}
arr\u令牌\u用法[$count]=${arr[1]}
count=`expr$count+1`
fi
完成 #使用所有令牌逐行读取源文件测试
totalMemKB=$(awk'/MemTotal:/{print$2}'/proc/meminfo)
echo“总内存=$totalMemKB”
读行时

结果\u标记\u搜索=”
#对于“${arr_token_name[@]}”中的j
#做
#echo“index=$j”
#完成
count2=0
对于“${arr_token_name[@]}”中的i

#此处搜索行中的令牌,如果找到
#计算此设备的内存,从arr\u令牌\u使用率中获取使用率百分比,然后使用计算公式,然后使用设备1024
#然后将-Xmx\d{1,5}m替换为-Xmx
echo“line1=$line”
结果_标记_搜索=$(echo$行| grep-P“$i”)
如果[-n“$result\u token\u search”]
然后
百分比使用率=${arr\u令牌使用率[$count2]}
let heapKB=$totalMemKB*$percent_usage/100
设heapMB=$heapKB/1024
echo“sed之前=$line”
line=($(echo$line | sed“s/${-Xmx\d{1,3}m}/$-Xmx{$heapMB}m/g”)
echo“新行=$line”
echo“在$line行中找到令牌,令牌=$i”
fi
结果\u标记\u搜索=”
count2=`expr$count2+1`
cat“$line”>>tmp.txt
完成
完成 试试这句话:

line=$( sed  "s/-Xmx[0-9]\+/-Xmx$heapMB/" <<<$line )
line=$(sed“s/-Xmx[0-9]\+/-Xmx$heapMB/)
kent$  line="Superviser.childOpts:-Xmx128m" 

kent$  heapMB=750    

kent$  line=$( sed  "s/-Xmx[0-9]\+/-Xmx$heapMB/" <<<$line )    

kent$  echo $line
Superviser.childOpts:-Xmx750m