Aqui estou aprendendo sed, aqui está com vários comandos:
(user@host)-(18:27:39)-(~/Bash_Programming)
$sed '4 { s/fox/elephant/; s/dog/cat/ }' catAndDog.txt
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
Mas onde coloco o sinalizador de substituição w se estiver usando vários comandos e quiser que os resultados sejam gravados em um arquivo?
w file = write the result of the substitution to a file
EDITAR:
Eu quero gravar toda a saída no arquivo, uma cópia do original com as alterações feitas.
Em resposta a:
Você pode redirecionar para um arquivo como
Ou modifique no local com
-i
sinalizador:... ou faça um backup do arquivo original e grave as alterações com o mesmo nome de arquivo original.
Ou com
w
o comando:Se você deseja apenas escrever as linhas em que a
s
substituição do comando foi bem-sucedida (o que não é o que você está solicitando atualmente), usando ow
sinalizador, você pode fazer:O
w
sinalizador deve ser encerrado com uma nova linha ou deve ser o último item (incluindo o argumento) em um script sed. Se forem encontrados espaços em branco, comentários ou ponto e vírgula, eles serão incluídos no nome do arquivo.Não confunda o
w
sinalizador associado à substituição do comandos
(s///w
) e ow
comando. Eles são semelhantes, mas ow
sinalizador só é usado se a substituição for realizada. Observe que ow
comando pode ser usado condicionalmente ou incondicionalmente dependendo do script sed (casos de uso).Nota: a opção
i
(--in-place
) não é especificada pelo POSIX.Primeiro exemplo
Segundo exemplo
Alguém pode encontrar um problema com o seu caso (veja abaixo) porque várias substituições são executadas na mesma linha de entrada.
Há apenas uma linha de entrada modificada, mas o arquivo de saída contém duas linhas.
Este resultado não é conveniente porque é enganoso.
Minha solução permite criar um backup do arquivo original (
input.back
), aplicar as alterações no arquivo original (input
) e gravar possíveis substituições em outro arquivo (output
). Este algoritmo usa ow
comando.O comando
/fox|dog/!d
inicia imediatamente o próximo ciclo sefox
oudog
não for encontrado (nenhum deles). Portanto, se uma palavra-chave não for encontrada, os comandos a seguir (s///
,p
,w
) não serão processados para a linha atual.Na verdade, existem dois
w
elementos. Um é um comando, o outro é umas///
bandeira.Ambos são usados para gravar o espaço de padrão atual em um arquivo.
comando
Por exemplo, este
w
comando gravará emoutfile
(faça uma cópia):A
-n
opção evita imprimir qualquer espaço de padrão, mas ow
comando iráwrite
cada padrão (linha) para o nome do arquivo no argumento após ow
comando (que deve encerrar o comando).Isso, em vez disso, escreverá apenas uma linha (a linha que tem (pelo menos) uma
C
):bandeira
O outro
w
elemento é ow
sinalizador para os///
comando, que embora signifique quase o mesmowrite
, ele só é executado se a substituição nos///
comando for executada:Q1
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:
Observe que cada substituição deve estar em separado
-e
(ou linhas separadas), pois o nome do nome do arquivo de saída deve terminar o comando (precisa de uma nova linha) ou pode ser escrito como:A outra substituição pode ser selecionada com:
Ou ambos:
Ou use o
w
comando (não flag) (e assumindo GNU sed):Q2
Um sinalizador de substituição não pode gravar o arquivo inteiro , a menos que a substituição ocorra para todas as linhas. Você precisa usar o
w
comando (assumindo bash):Entenda que um
w
sinalizador para cada substituição imprimirá uma linha para cada substituição, então isso acontecerá: