Censor text with regex

6

Atualmente, estou executando este comando para censurar uma lista de tarefas recuadas.

sed -e 's/\(\s\+- \)\(.*\)/XXX/g'

É ótimo, exceto que eu gostaria que o número de X s correspondesse ao número de caracteres correspondentes. Como faço isso? A maneira correta não precisa usar o sed.

Exemplo de entrada atual:

- Hello World
  - Earth

Saída:

- XXX
  - XXX

Desejado:

- XXXXXXXXXX
  - XXXXX
    
por Zachary Vance 17.08.2015 / 02:44

3 respostas

2

Uma solução Perl:

perl -pe 's/^( *- )(.+)/$1."X"x length($2)/e'

Isso usa "X" x length($2) para obter o número correto de X s na substituição.

Entrada de teste:

- Hello World
  - Earth
This is not - censored

saída:

- XXXXXXXXXXX
  - XXXXX
This is not - censored
    
por 18.08.2015 / 13:02
3

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.

    
por 30.10.2017 / 19:13
1
$ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0)}1' <<EOM
- Hello
  - World 2015
This is not - censored
EOM

- XXXXX
  - XXXXX XXXX
This is not - censored

A expressão awk procura por todas as linhas que começam com um caractere - , após espaços em branco opcionais. Para linhas correspondentes, o comando gsub() substitui todos os caracteres, exceto os espaços em branco e o caractere - . O% final 1 é apenas um atalho para {print $0} , ou seja, para reimprimir toda a linha.

edit : Como você também precisa remover / substituir os caracteres de espaço em branco com X , não consigo pensar em uma solução mais elegante além de fazer uma substituição adicional:

$ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0);gsub(/X X/,"XXX",$0)}1' <<EOM
- Hello World
  - Earth
This is not - censored
EOM

- XXXXXXXXXXX
  - XXXXX
This is not - censored
    
por 17.08.2015 / 04:41