Использование sed для замены только одного экземпляра - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть текстовый файл: file.txt

hi
bye
test=VAR
test2=VAR_BYE
test3=VAR_HI

и я хочу заменить VAR в "test = VAR", но НЕ "test2 = VAR_BYE", чтобы он выводил

hi
bye
test=VARIABLE
test2=VAR_BYE
test3=VAR_HI

Я пробовал следующее, и оно не работает. Как мне использовать sed для этого?

var="VARIABLE"
var2="s/VAR/$var/g"
sed -e $var2 file.txt > file2.txt

и

sed -e "s/\<VAR\>/VARIABLE/g" file.txt > file2.txt

Что я делаю не так? Я не пытаюсь повлиять на первый случай, только тот, который точно соответствует VAR.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Переносимое решение состоит в том, чтобы включить в шаблон конец строки, заданный как $:

sed 's/VAR$/VARIABLE/' file.txt > file2.txt

Более ограниченная альтернатива (т. Е. Для более точного соответствия требуется подстановка) будет соответствовать точной строке

sed 's/^test=VAR$/test=VARIABLE/' file.txt > file2.txt

Границы, которые вы использовали в \<VAR\>, являются расширением регулярных выражений. Они не указаны в базовых c регулярных выражениях, необходимых для sed по стандарту POSIX . Вы узнали, что ваша версия sed их не поддерживает.

0 голосов
/ 21 апреля 2020

Не совсем понятно, что вы подразумеваете под «только заменить один экземпляр» - я склонен полагать, что вы хотите заменить слово VAR значением, хранящимся в Переменная $var, где VAR - полное слово. Правильно?

Быстрый поиск в Google «границы слова sed во FreeBSD» помогает нам понять, что в sed FreeBSD якорями границы слова являются [[:<:]] и [[:>:]]. Итак, должно работать следующее:

var="VARIABLE"
var2="s/[[:<:]]VAR[[:>:]]/$var/g"
sed "$var2" file.txt > file2.txt
...