2013-08-19 58 views
1

如何搜索和替换整个单词。Bash脚本搜索整个单词并替换

我写了一个脚本,这样

Profile="panicA2 panicA1 panicA0 gasleakB0" 
Bypass="0 panicA1 gasleakB0" 
Current="$Profile" 
for Bypass_final in $Bypass ; do 
    Current=${Current/$Bypass_final/ } 
done 

从我的剧本的预期产量为panicA2 panicA0

,但我的输出是panicA2 panicA在panciA0 0是越来越删除,我想如果删除字呢目前不是一个字符 我怎么能实现这个?

我用sed即使这不是为我工作

Current=`sed "s/\bCurrent\b/$Bypass_final/g"` 

回答

0

它可能使用sed立即替换所有需要的字,而不是遍历它们并逐个替换。

Profile="panicA2 panicA1 panicA0 gasleakB0" 
Bypass="0 panicA1 gasleakB0" 

# prepare the regex 
Pattern=$(echo "\\b\\("$Bypass"\\)\\s\\?\\b" | sed 's/ /\\\|/g') 
echo $Pattern # \b\(0\|panicA1\|gasleakB0\)\s\?\b 

echo $Profile | sed "s/$Pattern//g" 
0

你可以尝试这样的事情: -

sed "s/[[:<:]]Yourword[[:>:]]/Replacedword/g" 
0

您的代码将永远匹配部分的话,下面应该工作打算。

Profile="panicA2 panicA1 panicA0 gasleakB0" 
Bypass="0 panicA1 gasleakB0" 
Current="$Profile" 
for Bypass_final in $Bypass ; do 
    if [[ $Current =~ ^$Bypass_final[[:space:]](.*)$ ]] \ 
     || [[ $Current =~ ^(.*)[[:space:]]$Bypass_final$ ]] \ 
     || [[ $Current =~ ^(.*)[[:space:]]$Bypass_final[[:space:]](.*)$ ]]; then 
     Current=${BASH_REMATCH[@]:1:$[${#BASH_REMATCH[*]} - 1]} 
    fi 
done 

echo $Current