仅当匹配构成整个单词时,我如何才能查找和替换?

dil*_*han 5 sed shell-script text-processing regular-expression

我的脚本是:

n="y"
while [ "{n}" = "y" ]
if [ $n == "n" ];
then
  break;
fi
echo "n is $n"
do
        read -p "Enter the word to find = " word
        read -p "Enter word to replace = " replace
        echo "$word n $replace"
        #sed -i r.text.bak 's/$word/$replace/g' r.txt
        sed -i "s/$word/$replace/g" "test.txt"
echo "do you have further replacement? n or y"
read temp
n=$temp
done
Run Code Online (Sandbox Code Playgroud)

我的问题是我也在替换部分匹配。例如,对于这样的一行:

1.1.1.14 1.1.1.14567
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

1.1.1.3  1.1.1.3567
Run Code Online (Sandbox Code Playgroud)

但我预计:

1.1.1.3 1.1.1.14567
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

ter*_*don 7

您需要以仅匹配整个单词的方式编写正则表达式。使用 GNU sed,您可以使用\b单词边界处的匹配项:

sed -i "s/\b$word\b/$replace/g"
Run Code Online (Sandbox Code Playgroud)

如果你知道那里总会有一个空格,你可以添加一个空格:

sed -i "s/ $word /$replace/g"
Run Code Online (Sandbox Code Playgroud)

现在,您的脚本也存在一些问题。你的if ... break说法没用,while已经在处理了。所有你需要的是:

#!/usr/bin/env bash
n="y"
while [ "$n" = "y" ]
do
    echo "n is $n"
    read -p "Enter the word to find = " word
    read -p "Enter word to replace = " replace
    echo "$word n $replace"
    sed -i "s/\b$word\b/$replace/g" test.txt
    echo "do you have further replacement? n or y"
    read temp
    n="$temp"
done
Run Code Online (Sandbox Code Playgroud)