Я не хочу заменять любые буквы словами. Я хочу заменить только отдельные буквы точными совпадениями с учетом регистра.
У меня есть файл, который выглядит так:
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
Возможный дубликат sed поиск и замена всего слова
Используйте \b
в регулярном выражении, чтобы соответствовать границе слова.
sed -i 's/\ba\b/ASTRING/g' file.txt
Кстати, вы не можете использовать -i
, если вы передаете ввод в sed
, имя файла должно быть аргументом для sed
. Если он получает ввод со стандартного ввода, ему неизвестно имя файла, поэтому он не может обновить файл на месте.
переменные 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
Почему бы просто не использовать ассоциативный массив?
Рассматривал это, но это было достаточно абстрактно, поэтому я хотел упростить пример.
Это не шуточный вопрос, это
sed
вопрос, не так ли? В регулярном выражении есть специальный символ \b, означающий «граница слова».