Команда sed создает файлы с произвольным именем - PullRequest
12 голосов
/ 12 октября 2011

Недавно я написал скрипт, который выполняет команду sed, чтобы заменить все вхождения «string1» на «string2» в файле с именем «test.txt».

Это выглядит так:

sed -i 's/string1/string2/g' test.txt

Уловка в том, что "string1" не обязательно существует в test.txt.

Я замечаю, что после выполнения нескольких команд sed я получаю несколько пустых файлов, оставленных позадив каталоге с именами, которые выглядят так:

"sed4l4DpD"

Кто-нибудь знает, почему это может быть, и как я могу это исправить?

Ответы [ 4 ]

8 голосов
/ 12 октября 2011

-i - суффикс, присвоенный новому / выходному файлу.Кроме того, вам нужно -e для команды.
Вот как вы ее используете:

sed -i '2' -e 's/string1/string2/g' test.txt

Это создаст файл с именем test.txt2, который является резервной копией test.txt

На заменить файл (вместо создания новой копии - называемой заменой на месте), измените значение -i на '' (то есть пустое):

sed -i '' -e 's/string1/string2/g' test.txt

EDIT II

Вот фактический вывод командной строки Mac (Snow Leopard), который показывает, что мой измененный ответ (удаленный пробел между -i и суффиксом) правильный.
ПРИМЕЧАНИЕ:На сервере Linux не должно быть пробела между -i и суффиксом.

> echo "this is a test" > test.txt
> cat test.txt
this is a test
> sed -i '2' -e 's/a/a good/' test.txt 
> ls test*
test.txt    test.txt2
> cat test.txt
this is a good test
> cat test.txt2
this is a test
> sed -i '' -e 's/a/a really/' test.txt 
> ls test*
test.txt    test.txt2
> cat test.txt
this is a really good test
5 голосов
/ 12 октября 2011

Я не смог воспроизвести это с помощью быстрого теста (используя GNU sed 4.2.1) - но strace показала, что sed создала файл с именем sedJd9Cuy и затем переименовала его в tmp (файл с именем командная строка).

Похоже, что-то идет не так после того, как sed создаст временный файл и до того, как сможет переименовать его.

Мое лучшее предположение, что вам не хватает места в файловой системе; Вы можете создать новый пустой файл, но не можете записать в него.

Что говорит df .?

EDIT

Я до сих пор не знаю, что является причиной проблемы, но не должно быть слишком сложно обойти ее.

Вместо

sed -i 's/string1/string2/g' test.txt

попробуйте что-то вроде этого:

sed 's/string1/string2/g' test.txt > test.txt.$$ && mv -f test.txt.$$ test.txt

Что-то не так с тем, как sed создает, а затем переименовывает текстовый файл, чтобы заменить исходный файл. Приведенная выше команда использует sed в качестве простого фильтра ввода-вывода и создает и переименовывает временный файл отдельно.

3 голосов
/ 12 октября 2011

Итак, после большого тестирования прошлой ночью оказалось, что sed создавал эти файлы при попытке оперировать пустой строкой. Я получил массив аргументов «$ string1» с помощью команды grep, которая, похоже, неверна. Что я хотел от grep, так это все строки, содержащие что-то типа "Text here '.'".

Например, строка "Text here 'ABC.DEF'" в файле должна была быть перехвачена grep, тогда часть строки ABC.DEF будет заменена на ABC_DEF. К сожалению, grep, который я использовал, ловил строки типа "Text here ''" (то есть ничего между ''). Когда позже сценарий попытался выполнить замену sed с помощью этой пустой строки, был создан случайный файл (вероятно, из-за того, что sed умер).

Спасибо за вашу помощь в понимании того, как работает sed.

0 голосов
/ 21 января 2016

Лучше, если вы сделаете это следующим образом:

cat large_file | sed 's/string1/string2/g' > file_filtred

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...