BASH仅在一个字不成单词的情况下替换单个字母

时间:2019-06-21 20:17:47

标签: bash

我不想用单词替换任何字母。我只想用完全区分大小写的匹配替换单独的字母。

我有一个看起来像这样的文件:

file>-string pile stage one on one/a>b
system > use while one is one stage/sump/f
get sole--> one by one dir/sub/main/c >b
multi string return one by one sub//c static a
ect...
ect...

我想替换不属于单词的字母。

a=ASTRING
b=BSTRING
c=CSTRING
f=FSTRING

所需的输出如下:

file>-string pile stage one on one/ASTRING>BSTRING
system > use while one is one stage/sump/FSTRING
get sole--> one by one dir/sub/main/CSTRING >BSTRING
multi string return one by one sub//CSTRING static ASTRING
ect...
ect...

这是我一直在尝试的:

sed -i "s|a|ASTRING|g" file.txt

grep [a] file.txt | sed -i "s|a|ASTRING|g"

Repeated for b c f 

2 个答案:

答案 0 :(得分:2)

在正则表达式中使用\b来匹配单词边界。

sed -i 's/\ba\b/ASTRING/g' file.txt

顺便说一句,如果将输入管道输送到-i,则不能使用sed,文件名必须是sed的参数。如果它从标准输入中获取输入,则它不知道文件名,因此无法就地更新文件。

答案 1 :(得分:0)

nameref变量进行救援。

a=ASTRING
b=BSTRING
c=CSTRING
f=FSTRING
for v in a b c f
do declare -n R=$v
   sed -Ei "s/\\b$v\\b/$R/g" file.txt
done