На самом деле имеется дваw
элемента. Один — команда, другой — флаг s///
.
Оба используются для записи текущего пространства шаблонов в файл.
Например, эта команда w
запишет вoutfile
(сделать копию):
$ printf '%s\n' AA BB CC DD EE > infile
$ sed -n 'w outfile' infile
$ cat outfile
AA
BB
CC
DD
EE
Опция -n
позволяет избежать печати любого пространства шаблона, но команда w
будет write
каждый шаблон (строку )указывать на имя файла в аргументе после команды w
(, которая должна завершить команду ).
Это, вместо этого, напишет только одну строку (строку, которая имеет (по крайней мере )одинC
):
$ sed -n '/C/ w outfile' infile ; cat outfile
CC
Другой элемент w
— это флаг w
для команды s///
, который хотя и означает примерно то же самое write
, но выполняется только в том случае, если подстановка в команде s///
была выполнена:
$ sed -n 's/C/X/w outfile' infile; cat outfile
XC
But where do I put the w substitution flag if I'm using multiple commands and want the results wrote to a file?
Поскольку флаг подстановки связан с одной (конкретной )заменой, где его следует использовать, зависит от того, какую замену необходимо записать:
$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/' infile; cat outfile
XB
Обратите внимание, что каждая замена должна быть в отдельной-e
(или отдельной строке ), так как имя выходного файла должно заканчиваться командой (требуется новая строка ),или может быть записано как:
$ sed -n -e 's/B/X/w outfile
> s/D/Y/' infile; cat outfile
XB
Другая замена может быть выбрана с помощью:
$ sed -n -e 's/B/X/' -e 's/D/Y/w outfile' infile; cat outfile
YD
Или оба:
$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/w outfile' infile; cat outfile
XB
YD
Или используйте команду w
(без флага)(и предполагая, что GNU sed):
$ sed -n 's/B/X/;s/D/Y/;w outfile' infile; cat outfile
AA
XB
CC
YD
EE
I want to write the whole output to the file, a copy of the original with the changes made.
Флаг подстановки не может записать весь файл, если замена не происходит для всех строк. Вам нужно использовать команду w
(, предполагая, что bash):
$ printf 'The quick brown fox jumps over the lazy dog%.0s\n' {1..14} >catAndDog.txt
$ sed -n '4 { s/fox/elephant/ ; s/dog/cat/ } ; w outfile' catAndDog.txt
$ cat outfile
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
Поймите, что флаг w
для каждой замены будет печатать строку для каждой замены, так что это произойдет:
$ sed -n -e '4 { s/fox/elephant/w outfile' -e 's/dog/cat/w outfile' -e '}' catAndDog.txt
$ cat outfile
The quick brown elephant jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
Да, вы можете создавать файлы и/или каталоги в /dev/
. Но вы не можете ожидать, что они все еще будут там после перезагрузки.
Вот почему :файловая система dev
отвечает за доступ к устройству. Это не блочная файловая система (с базовой «реальной» памятью ), а файловая система на основе памяти -. Поскольку он существует только в ОЗУ, все под /dev/
стирается при завершении работы и воссоздается при загрузке.
Население /dev/
может быть выполнено тремя способами:
udev
devtmpfs
. Вот несколько ссылок на отличные посты с подробным описанием этого:
dev
:Понимание /dev и его подкаталогов и файловdevtmpfs
:использования devtmpfs для /devdev
файлы:Как создаются файлы "/dev" в Linux?