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