Bash脚本搜索整个单词并替换

时间:2013-08-19 06:51:51

标签: bash shell scripting

如何搜索和替换整个单词。

我写了一个像这样的剧本

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"`

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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

答案 2 :(得分: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"