bash 中的字符串替换 (${s//$foo/$bar}) 不适用于反斜杠
String substitution (${s//$foo/$bar}) in bash not working with backslashes
我在变量中有一个字符串,我想用另一个字符串替换它,但是当匹配的字符串包含反斜杠时,该操作无效。
这是脚本中不起作用的部分:
cpuQueueOutput=`/usr/local/nagios/libexec/check_nrpe -H $hostname -t 30 -c Check_Pdh -a 'counter=\System\Processor Queue Length'`
echo "CPU Queue1: $cpuQueueOutput"
matchCpuQueueOutput="\System\Processor"
newCpuQueueOutput="CPU Queue"
CpuQueuePerf=`echo ${cpuQueueOutput//$matchCpuQueueOutput/$newCpuQueueOutput}`
echo "CPU Queue2: $CpuQueuePerf"
脚本的输出如下所示:
CPU Queue1: OK: |'\System\Processor Queue Length_value'=0;0;0
CPU Queue2: OK: |'\System\Processor Queue Length_value'=0;0;0
OK: CPU Stats {(total, avg 1m: 9%), (total, avg 5m: 3%)} Top 3 Processes: {(powershell : 64%), (svchost#3 : 0%), (svchost#2 : 0%)} | 'total 1m'=9%;90;95 'total 5m'=3%;90;95
将 OK: |'\System\Processor Queue Length_value'
替换为 'CPU Queue'
的替换无效。
使用更多引号!
# $'' makes the shell interpret backslashes, for easier embedding of single quotes
# inside a single-quoted string.
s=$'|\'\System\Processor Queue Length_value\'=0;0;0'
match="\System\Processor"
replace="CPU Queue"
echo "${s//"$match"/$replace}" # ignore Whosebug's incorrect syntax highlighting
...相对于...
echo "${s//$match/$replace}"
这是有效的,因为在 bash 中引用模式匹配上下文中的扩展会生成该扩展文字的结果——反斜杠需要被视为文字以匹配它们自己。
我在变量中有一个字符串,我想用另一个字符串替换它,但是当匹配的字符串包含反斜杠时,该操作无效。
这是脚本中不起作用的部分:
cpuQueueOutput=`/usr/local/nagios/libexec/check_nrpe -H $hostname -t 30 -c Check_Pdh -a 'counter=\System\Processor Queue Length'`
echo "CPU Queue1: $cpuQueueOutput"
matchCpuQueueOutput="\System\Processor"
newCpuQueueOutput="CPU Queue"
CpuQueuePerf=`echo ${cpuQueueOutput//$matchCpuQueueOutput/$newCpuQueueOutput}`
echo "CPU Queue2: $CpuQueuePerf"
脚本的输出如下所示:
CPU Queue1: OK: |'\System\Processor Queue Length_value'=0;0;0
CPU Queue2: OK: |'\System\Processor Queue Length_value'=0;0;0
OK: CPU Stats {(total, avg 1m: 9%), (total, avg 5m: 3%)} Top 3 Processes: {(powershell : 64%), (svchost#3 : 0%), (svchost#2 : 0%)} | 'total 1m'=9%;90;95 'total 5m'=3%;90;95
将 OK: |'\System\Processor Queue Length_value'
替换为 'CPU Queue'
的替换无效。
使用更多引号!
# $'' makes the shell interpret backslashes, for easier embedding of single quotes
# inside a single-quoted string.
s=$'|\'\System\Processor Queue Length_value\'=0;0;0'
match="\System\Processor"
replace="CPU Queue"
echo "${s//"$match"/$replace}" # ignore Whosebug's incorrect syntax highlighting
...相对于...
echo "${s//$match/$replace}"
这是有效的,因为在 bash 中引用模式匹配上下文中的扩展会生成该扩展文字的结果——反斜杠需要被视为文字以匹配它们自己。