Na verdade, existem dois w
elementos. Um é um comando, o outro é um sinalizador s///
.
Ambos são usados para escrever o espaço padrão atual em um arquivo.
comando
Por exemplo, esse comando w
gravará em outfile
(faça uma cópia):
$ printf '%s\n' AA BB CC DD EE > infile
$ sed -n 'w outfile' infile
$ cat outfile
AA
BB
CC
DD
EE
A opção -n
evita imprimir qualquer espaço padrão, mas o comando w
irá write
de cada padrão (linha) para o nome do arquivo no argumento após o comando w
(que deve terminar o comando). / p>
Isso, em vez disso, irá escrever apenas uma linha (a linha que tem (pelo menos) um C
):
$ sed -n '/C/ w outfile' infile ; cat outfile
CC
bandeira
O outro elemento w
é o w
para o comando s///
, que, embora signifique o mesmo write
, só será executado se a substituição no comando s///
for executada:
$ sed -n 's/C/X/w outfile' infile; cat outfile
XC
Q1
But where do I put the w substitution flag if I'm using multiple commands and want the results wrote to a file?
Como um sinalizador de substituição está conectado a uma substituição (específica), onde deve ser usado depende de qual substituição precisa ser registrada:
$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/' infile; cat outfile
XB
Observe que cada substituição deve estar em -e
(ou linhas separadas) separadas, pois o nome do nome do arquivo de saída deve terminar com o comando (precisa de uma nova linha) ou pode ser escrito como:
$ sed -n -e 's/B/X/w outfile
> s/D/Y/' infile; cat outfile
XB
A outra substituição pode ser selecionada com:
$ sed -n -e 's/B/X/' -e 's/D/Y/w outfile' infile; cat outfile
YD
Ou ambos:
$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/w outfile' infile; cat outfile
XB
YD
Ou use o comando w
(não sinalizar) (e supondo que o GNU sed):
$ sed -n 's/B/X/;s/D/Y/;w outfile' infile; cat outfile
AA
XB
CC
YD
EE
Q2
I want to write the whole output to the file, a copy of the original with the changes made.
Um sinalizador substituição não pode gravar o arquivo inteiro , a menos que a substituição ocorra em todas as linhas. Você precisa usar o comando w
(assumindo 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
Entenda que um sinalizador w
para cada substituição imprimirá uma linha para cada substituição, então isso acontecerá:
$ 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