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)
我该如何解决这个问题?
您需要以仅匹配整个单词的方式编写正则表达式。使用 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)