Как заменить, не создавая промежуточный файл в sed? - PullRequest
10 голосов
/ 31 июля 2011

Я занимался практикой с командой Unix sed. Я пробовал команду подстановки и добавления в файл. Но сложность в том, что мне нужно создать промежуточный файл, а затем сделать mv, чтобы переименовать его в исходный файл.

Есть ли способ сделать это одним выстрелом в одном и том же файле?

[root@dhcppc0 practice]# sed '1i\
 > Today is Sunday
 > ' file1 > file1

[root@dhcppc0 practice]# cat file1
[root@dhcppc0 practice]#

Файл удален!

[root@dhcppc0 practice]# sed 's/director/painter/' file1 > file1
[root@dhcppc0 practice]# cat file1

Файл удален!

Ответы [ 3 ]

17 голосов
/ 27 сентября 2011

Попробуйте это -

sed -i '' 's/originaltext/replacementtext/g' filename | cat filename

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

/ g для глобальной замены.Если у вас более одного исходного текста в одной строке, параметр / g заменит все остальное, он заменит только первый.

13 голосов
/ 31 июля 2011

GNU sed знает параметр -i, который на месте редактирует данные файлы.

При выполнении операции file1 > file1 на самом деле происходит то, что файл открывает и усекает оболочкой до программа (которая получает имя в качестве аргумента) начинает читать что-либо из нее.

Обновление :

На странице справки sed указано следующее: -i (спасибо Делану за упоминание):

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if extension supplied)
1 голос
/ 31 июля 2011

sed -i.bak 's / Director / Painter /' file1

 -i[SUFFIX], --in-place[=SUFFIX]

    edit files in place (makes backup if extension supplied)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...