Dado o seguinte arquivo:
foo bar baz
this and that
então posso facilmente "desdobrar" essas linhas com substituição global com ed(1):
g/ /s//\
/g
que dá:
foo
bar
baz
this
and
that
Mas o que é uma maneira suave de "dobrar linhas"?
Não consigo usar o padrão \n
or \<newline>
em um g/re/s
idioma. Atualmente, estou usando a seguinte abordagem:
- Insira espaços.
- Juntar.
1
+,++s/^/ /
--,.jp
++,+++s/^/ /
--,.jp
,p
para voltar:
foo bar baz
this and that
mas é bem desajeitado e eu me pergunto se existe uma maneira melhor!
Você não deve conseguir inserir novas linhas com uma substituição do
g
comando * , então presumo que você esteja usando GNUed
(acontece que algumas outrased
implementações também podem fazer isso).Eu uniria as linhas uma por uma, o que pode ser feito usando dois comandos: adicione um espaço ao final da linha atual e, em seguida, junte a próxima linha a ela:
Ao processar mais linhas, você só precisa repetir os comandos
s
ej
, com os
comando encurtado para apenass
(umed
recurso do GNU).Sessão de exemplo; estou usando
nl
(exibir linhas numeradas de forma inequívoca) em várias instâncias apenas para ilustrar o que está acontecendo:Agora juntando as linhas 3 e 4 na linha 2:
Não precisei dizer nada
2 s
sobre a segunda substituição acima porque nunca me afastei da linha 2. Se eu tivesse listado as linhas no arquivo com, por exemplo,,nl
ou algum comando semelhante (que nos teria movido para outro lugar) como fiz ao ingressar na linha 1, eu teria que ter sido mais específico com o endereçamento.Sem olhar muito para o resultado:
Eu poderia ter usado
+ s
instead of2 s
above, pois sei que quero fazer a substituição subsequente na linha seguinte.Outra maneira de fazer isso, que não requer GNU
ed
, é primeiro adicionar um espaço ao final de todas as linhas e, então, unir as que queremos unir. Os espaços finais são então removidos:O comando
1;++j
move o cursor para a linha 1 e então junta as duas linhas seguintes a ela. Isso é mais compacto, mas na verdade envolve mais digitação no geral.Se trapaça for permitida, poderíamos usar o
paste
comando externo. Note queed
não há noção de "filtrar o buffer ou partes do buffer por meio de um comando externo", então o que fazemos aqui é jogar fora o buffer atual e começar a editar a saída depaste
:* Da especificação POSIX de
ed
: