Você pode fazer isso com sed também:
sed '/^[[:blank:]]*-[[:blank:]]/{
h
s///
s/./X/g
x
s/\([[:blank:]]*-[[:blank:]]\).*//
G
s/\n//
}' infile
Isso copia a linha sobre o buffer h old, remove a primeira parte [[:blank:]]*-[[:blank:]] , substitui os caracteres restantes por X e, em seguida, e x altera o padrão / espaço de espera, agora a string censurada está em o padrão de espera e a linha original está de volta ao espaço padrão. A segunda parte da linha é removida com s/\(...\).*// , a cadeia no espaço de suspensão é anexada ao espaço padrão ( G ) e o caractere \n ewline é removido. Então, com um arquivo como:
- line here
not - to be modified
- a b c d e
- another line-here
a saída é:
- XXXXXXXXX
not - to be modified
- XXXXXXXXX
- XXXXXXXXXXXXXXXXX
Se você deseja remover caracteres em branco e substituir apenas os que não estão em branco por X :
sed '/^[[:blank:]]*-[[:blank:]]/{
h
s///
s/[[:blank:]]//g
s/./X/g
x
s/\([[:blank:]]*-[[:blank:]]\).*//
G
s/\n//
}' infile
saída:
- XXXXXXXX
not - to be modified
- XXXXX
- XXXXXXXXXXXXXXXX
ou, em uma linha com gnu sed :
sed -E '/^[ \t]*-[ \t]/{h;s///;s/[ \t]//g;s/./X/g;x;s/([ \t]*-[ \t]).*//;G;s/\n//}' infile
Ajuste o regex (ou seja, ^[[:blank:]]*-[[:blank:]] ) de acordo com suas necessidades.