BASH заменяет одну букву только тогда, когда она одна, а не в слове - PullRequest
0 голосов
/ 21 июня 2019

Я не хочу заменять какие-либо буквы словами. Я хочу заменить только отдельные буквы точными совпадениями с учетом регистра.

У меня есть файл, который выглядит так:

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 ]

2 голосов
/ 21 июня 2019

Используйте \b в регулярном выражении, чтобы соответствовать границе слова.

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

Кстати, вы не можете использовать -i, если вы вводите данные в sed, имя файладолжен быть аргументом sed.Если он получает данные из стандартного ввода, он не знает имя файла, поэтому не может обновить файл на месте.

0 голосов
/ 21 июня 2019

переменные 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...