Este é um caso de uso perfeito para ex
.
Se você ainda não ouviu falar, ex
é o antecessor de vi
e, como vi
, é especificado pelo POSIX e disponível essencialmente * em qualquer lugar.
ex
é realmente projetado para edição de arquivos , mas você pode usá-lo sem salvar as alterações também.
Imprimir alterações, não salve no arquivo:
printf '%s\n' 'g/^,/-j!' %p | ex file.txt
Faça alterações e salve no arquivo:
printf '%s\n' 'g/^,/-j!' x | ex file.txt
Explicação:
Eu uso o comando printf
como um wrapper para ex
para edições de arquivos com script. Este formulário tem a vantagem de que em qualquer falha (por exemplo, você passa um comando que não é um comando real ou tenta endereçar um número de linha que não existe), o comando simplesmente sai (sem salvar nenhuma alteração) em vez de esperando por outra entrada.
Você pode ver os comandos exatos passados por printf
to ex
executando o comando printf
sozinho:
$ printf '%s\n' 'g/^,/-j!' %p
g/^,/-j!
%p
Ok, o que esses comandos fazem?
Bem, g
é o comando "global" e executa o seguinte comando em todas as linhas no "buffer" (arquivo) que corresponde ao regex ^,
(início da linha seguido por uma vírgula). / p>
O comando neste caso é -j!
. O -
é um endereço e significa executar o seguinte comando na linha anterior para a linha atual. (Em outras palavras, nas linhas antes linhas começando com uma vírgula.)
j
é para "join" e une a linha com a seguinte linha. O exclam ( !
) suprime o uso de um caractere de espaço para separar a linha original da linha associada a ela.
%
é um endereço que significa "todo o buffer" e p
significa "imprimir".
x
significa salvar as alterações e sair.
Como eu disse, é um exemplo perfeito de um caso de uso para ex
.
* Exceto o Windows. : P