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.