2015-04-27 1 views
1

Не уверен, что происходит, я заменил gnu sed, но я как-то получаю резервные файлы. Это именно то, что я делаюSED добавляет файл с суффиксами при использовании в OSX?

mkdir tmp && cd $_ 
echo 'test' > test.txt 
ls 
    test.txt 

sed -ie 's/test/replaced/g' test.txt 
ls 
    test.txt 
    test.txte 

Что здесь происходит и как это предотвратить? Он должен править на месте, а не создавать резервную копию

СЕПГ версия (GNU sed) 4.2.2

+1

Примечание для будущих читателей: вопрос отмечен 'osx', который изначально поставляется с _BSD_' sed', но вопрос явно о _GNU_ 'sed', так что это поведение последнего имеет значение, а платформа случайна. – mklement0

ответ

3

В соответствии с фантастическими комментариями mklement0 спецификации POSIX говорит нам, что:

С опциональными-аргументами, POSIX подсобных конвенции требуют, чтобы (курсив его) «конформная заявка помещайте ВАРИАНТ-аргумент в пользу этот вариант непосредственно рядом с параметром в той же строке аргумента, без промежуточных символов.

Поскольку GNU SED считает суффикс аргумент -i быть необязательно это требует, чтобы быть обнимались против аргумент параметра, поэтому, когда вы пишете -ie, GNU sed интерпретирует это как запрос суффикса e для аргумента -i. (BSD sed интерпретирует его таким же образом по причинам, которые объясняются в дополнительной информации внизу.)

Все это означает, что вам нужно использовать -i -e, чтобы получить нужное поведение (для GNU sed) вместо этого (для BSD sed вам понадобится -i '' -e).


Дополнительные подробности о неудачном, но интересной различия между GNU СЭД и BSD СЭД:

GNU СЭД и BSD СЭД (OSX СЭД) согласны ли значение суффикс -i аргумент является необязательным или обязательным.

Это важно, потому что в дополнение к требованиям POSIX выше, мы находим следующее в спецификации, а также (внимание mkelement0 снова):

вариант с обязательной опцией-аргумента [...], соответствующего требованиям приложения должны использовать отдельные аргументы для этого параметра и его аргумент option. Однако соответствующая реализация также позволяет приложениям указывать опцию и параметр-аргумент в одной строке аргумента без промежуточных символов.

ГНУ СЭД считает суффикс быть необязательным (и это вызывает поведение выше), потому что он принимает обнималась e для дополнительного аргумента, но игнорирует отделенный -e (или что-либо еще) в качестве отдельного аргумента.

BSD sed считает, что суффикс обязателен (хотя он может быть пустым), это означает, что опция должна быть отделена от флага пробелом (например, -i .bak или -i ''), хотя, как отмечает «Однако», BSD sed также позволяет использовать любой непустой суффикс против флага -i.

Это несогласие, так как mklement0 указывает на то, что время от времени появляется на SO, означает, что вы не можете использовать пустой суффикс редактирования на месте способом, который переносится как для версий sed, так и для GNU и BSD.

+0

Спасибо, одобрены и ждут, чтобы принять – ehime

+1

Великий след mklement0, спасибо за разъяснение. upvoted – ehime

+0

@ mklement0 Обновлено. Я немного успокоился, потому что не был уверен, как лучше всего сохранить суть ответа и включить дополнительную информацию, не сделав мой ответ хуже, чем ответ Тадмана. Я думаю, что я справился с этим довольно хорошо. –

0

Как всегда, man страница помогает:

-i extension: Редактирование файлов на месте, сохраняя резервные копии с указанным расширением , Если задано расширение с нулевой длиной, резервная копия не будет сохранена. Не рекомендуется давать расширение нулевой длины, когда в месте редактирования ИНГ файлов, так как вы рискуете коррупции или частичное содержание в ситуациях, когда исчерпаны дисковое пространство и т.д.

Использование -ie добавляет e к конец. Удалите это.

Смежные вопросы