Meu método não exige nenhuma suposição sobre com que frequência Ddd
ocorre; pode ocorrer de forma irregular. O método deve funcionar, a menos que exista um caractere nulo em algum lugar na entrada ou a entrada não termine com uma nova linha (consulte this ), ou suas ferramentas são limitadas (por exemplo, sed -z
não é especificado por POSIX).
sed '1! s/^Ddd$/\x00Ddd/' | tr '\n' ' ' | sed -z 's/ $/\n/' | tr -d 'sed '1! s/^Ddd$/\x00Ddd/' | tr '\n' ' ' | sed -z 's/ $/\n/' | tr -d '%pre%'
'
O procedimento:
-
sed
detecta linhas que sãoDdd
e precede cada uma com um caractere nulo, a menos que a linha seja a primeira. Esses caracteres nulos agora separam nossas futuras linhas. -
tr
substitui cada caractere de nova linha por um caractere de espaço. Isso constrói nossas futuras linhas: as linhas antigas agora são separadas por espaços. - Cada uma, mas a última linha a ser, contém um espaço extra no final da linha inicial originalmente anterior a
Ddd
; a última linha a ser contém um espaço extra da nova linha final requerida pelo POSIX.sed -z
lê sequências com terminação nula (linhas a serem) e substitui esses caracteres de espaço à direita por novas linhas normais. Neste momento as futuras linhas se tornam linhas regulares. -
tr -d
remove caracteres nulos.