С одним входным файлом, который содержит только комментарии (начиная с #) и строки VARIABLE = значение, возможно ли заменить значение для одной переменной, если оно найдено, и, в противном случае, добавить пару в конец файла, если не найдено?
Мой текущий метод работает, удаляя его в первом проходе, затем добавляя его в конец файла во втором проходе, но этот метод портит порядок строк (и это также две разные команды):
sed -r "/^FOOBAR=.*$/d" -i samefile &&
sed -r "$ a\FOOBAR=newvalue" -i samefile
Есть ли в любом случае, чтобы сделать это, т.е. поддерживать порядок строк в одной строке sed? Если какая-то другая утилита (awk, ...) сделает это, я возьму это на себя.
источник
newvalue
хранится в переменной?sed "/^${varName}=/{h;s/=.*/=${varValue}/};\${x;/^$/{s//${varName}=${varValue}/;H};x}" ${VARFILE}
с переменными, двойные кавычки, чтобы обеспечить подстановку переменных и экранирование а$
, которое не является подстановкой в данный момент, дополнительно, если ваше значение хранится в$$varName
:sed "/^${varName}=/{h;s/=.*/=${!varName}/};\${x;/^$/{s//${varName}=${!varName}/;H};x}" ${VARFILE}
Это, вероятно, может быть сокращено. Это не одна команда sed, и она также использует grep, но, похоже, это именно то, что вам нужно. Это одна строка, и она редактирует файл на месте (без временных файлов).
источник
Вот более простой
sed
подход, так как мнеsed
hold space
нелегко работать с ним. Если вам удобноhold space
, использование подхода don_crissti дает дополнительную возможность сохранить что-либо из существующей линии, но это обычно очень редко.При таком подходе вы просто печатаете все, кроме линии, которую хотите отбросить, а затем в конце добавляете замену.
источник
Основываясь на других ответах, если вы хотите заменить значение переменной, если эта переменная присутствует в файле, и добавить его в конец файла, если его нет (это не то, что делают ваши опубликованные
sed
команды), вы мог бы попробовать это:источник
В awk это немного проще, хотя «редактирование на месте» не происходит автоматически:
источник
Просто используйте
grep
иecho
для создания пустой записи:Каждая строка сбрасывается с нулевым кодом ошибки.
источник
grep
иecho
На самом деле работает со следующим:
sed -i '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
В ответе выбран -i отсутствует.источник
чтобы сделать это с Perl и на месте это прекрасно работает для меня:
источник
grep
иecho
иperl
вместо того , чтобы делать все , что вperl
? Кроме того, запись в файл (>> my.file
), как вы читаете из него (grep my.file
)?