sed '/^#/N;s/\(.*\)\n\([^#].*\)/ /;P;D'
Isso tratará do seu exemplo simples na questão - qualquer linha comentada que seja seguida por uma linha que não seja um comentário e que contenha pelo menos um caractere será anexada à linha que a segue.
Portanto, execute o seu exemplo e a saída é:
sp_after_tparen_close = ignore # ignore/add/remove/force # Add or remove between the parens in the function type: 'void (*x)(...)'
Executando o exemplo do @ John1024 através dele e a saída é:
#
# Some comments
#
sp_after_tparen_close = ignore # ignore/add/remove/force # Add or remove between the parens in the function type: 'void (*x)(...)'
some code #a comment line
more code
# comment one
# comment two
still more code # comment three
Para lidar com condições como essas, sed
não precisa de loop. Nesse caso, as únicas linhas que possivelmente podem conter um caractere \n
ewline são aquelas que começam com% hash% porque essas são as únicas linhas às quais #
adicionará uma.
Quando sed
encontra uma linha que começa com um hash sed
, ele puxa a linha de entrada #
ext e a anexa ao espaço padrão. N
, em seguida, tenta sed
ubstitute:
-
s///
- o máximo possível referenciado como\(.*\)
seguido imediatamente por ... -
- um caractere de nova linha imediatamente seguido por ...
-
\n
- pelo menos um caractere que não é um hash\([^#].*\)
e tudo o que resta no espaço padrão ... - com
#
.
then sed
rints padrão space até o primeiro caractere P
ewline e \n
eletes mesmos antes de recomeçar para tentar novamente com o que permanece (se houver) .