Перезаписать одну строку в текстовом файле - PullRequest
1 голос
/ 24 июля 2011

Я ищу безопасный и надежный способ перезаписи ОДНОЙ строки в текстовом файле. Мне все равно, использует ли он sed, grep, perl. Это просто должно быть портативным и надежным. В частности, я пытаюсь заменить значение переменной, которую я сохранил в текстовом файле во время выполнения. Допустим, у меня есть файл с именем variables.txt, который содержит строку со значением userName = stephen. Допустим, моя программа хочет изменить имя пользователя на откровенное. Вот что я придумал, используя sed:

sed -i '' 's/userName.*/userName=frank/' variables.txt

Меня беспокоит то, что я читал, что в некоторых версиях sed использование ключа -i без указания файла резервной копии может привести к сбою команды или риску повреждения файла. Не вариант. Что, вы парни, думаете? Любые предложения будут ценны.

- редактировать -

Для тех, кто спрашивает, где я читал о сбое команды и повреждении файла. На странице руководства для моей версии sed не рекомендуется указывать пустое значение для ключа -i, а также посмотрите комментарии на этой странице здесь:"Кажется, что некоторые версии sed требуют аргумента после -i и другие не делают. В GNU sed версии 4.1.x кажется, что -i не требует аргумента и указывает пустой аргумент после его сбоя. "

Звучит так, будто единодушной рекомендацией является предоставить файл bkup, а затем удалить его после завершения команды. Однако я все еще обеспокоен этим решением, так как моя версия sed даже не поддерживает ключ --version. Моя главная задача заключается в том, чтобы решение было надежным и портативным. Еще раз спасибо.

Ответы [ 4 ]

1 голос
/ 24 июля 2011

Меня беспокоит то, что я читал, что в некоторых версиях sed использование ключа -i без указания файла резервной копии может привести к сбою команды или риску повреждения файла.

Где ты это прочитал?

Это не совсем верно: это не обычная проблема в sed , но все программы (включая sed) могут выйти из строя и в очень маловероятных ситуациях повредить данные. Таким образом, вы не должны слишком бояться повреждения данных с помощью sed.

В любом случае, почему вы не используете -i с расширением (например, -i.bak) для предоставления большей безопасности? В любом случае вы можете удалить файл резервной копии с помощью rm ...

1 голос
/ 24 июля 2011
t=`tempfile`
sed -e 's/userName.*/userName=frank/' variables.txt >$tempfile
cp $tempfile >variables.txt
rm $tempfile

вы также можете использовать mv, но это не сохранит права на файл

если tempfile недоступен, используйте другой метод ($$ .bak) для создания имени файла.

1 голос
/ 24 июля 2011

Пока вы не запускаете на windows, sed -i так же безопасен, как и все остальные.Даже если в середине процесса произойдет сбой компьютера, переменная. Txt будет иметь либо старое, либо новое содержимое - оно никогда не должно отсутствовать или повреждаться.

0 голосов
/ 24 июля 2011

Вы можете скопировать variables.txt в variables.txt.bak перед запуском команды, если хотите сохранить резервную копию.Или наоборот:

sed  's/userName.*/userName=frank/' variables.txt > variables.txt.fixed
if [ $? -eq 0 ]
then 
   cp variables.txt.fixed variables.txt 
fi 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...