Remover espaços no arquivo sob certos critérios

1

Eu quero limpar alguns arquivos e fazer com que eles sejam escritos de maneira mais uniforme.

Então, minha entrada pode ser algo assim:

$a$h$l )r
^9 ^5 l
\ urd

O problema é que alguns espaços são "desnecessários" e dificultam a comparação dos arquivos. Por esse motivo, desejo remover todos os espaços, a menos que eles sejam posicionados diretamente após um dos seguintes caracteres:

$
^
@
!
/
(
)

Por exemplo, em $<space> , o espaço deve ficar.

Ou se o espaço for o segundo caractere após um dos seguintes caracteres:

i 
o 
s
=
%

Assim, por exemplo, em iA<space> , o espaço fica para ficar. Em iC<space><space> , apenas o primeiro espaço consegue ficar.

Depois, há mais um personagem,

s

onde <space> pode seguir como o primeiro ou o segundo caractere.

No entanto, há uma dificuldade extra - em todos esses casos, os símbolos ou letras são um comando. Os personagens que os seguem são variáveis. Portanto, $ é um comando e, no caso de $$ , o primeiro sinal de dólar é o comando, o segundo é a variável. Por causa disso, no caso de $$<space> , o espaço deve ser excluído mesmo que siga um $ - porque o $ que segue é uma variável para o $ anterior. Isto é verdade para todos os "comandos" na primeira lista - eles são sempre seguidos por exatamente uma variável. Portanto, o mesmo se aplica, por exemplo, a ^$<space> . O espaço deve ser excluído neste caso, porque o $ é uma variável para ^.

Os itens na segunda lista, assim como o s na segunda lista, são sempre seguidos por duas variáveis. Portanto, por exemplo, ss<space><space> deve se tornar ss<space> , já que o segundo s é uma variável.

Esse problema só se coloca com os caracteres na primeira lista e com s , já que os comandos na segunda lista nunca serão seguidos diretamente por caracteres que também se apresentam como comandos.

Além destes, existem outros comandos não listados. No entanto, eles não são relevantes, pois não podem ser acompanhados pelo espaço. O espaço também não representa um comando em si.

Eu sei que isso é confuso, mas estou feliz em esclarecer quaisquer respostas que você possa ter.

Então, um exemplo de entrada pode ser:

:
$ $ $N
$  $  $a
$$ $^ $i
sa  s l r
*56 l r
o1 o 2
%A% $v

Onde a saída desejada seria:

:
$ $ $N
$ $ $a
$$$^$i
sa s lr
*56lr
o1 o 2
%A%$v

Estou usando um sistema operacional GNU / Linux.

    
por user146854 07.01.2016 / 14:39

1 resposta

3

Parece mais fácil que a sua primeira variante :

perl -pe 's{([\$^\@!/()].|[ios=%]..)| }{$1}g'

Mesmo com o GNU sed:

sed -E 's#([$^@!/()].|[ios=%]..)| ##g'

Ou uma variante portátil:

sed 's#\(\([$^@!/()].\)*\([ios=%]..\)*\) *##g'
    
por 07.01.2016 / 16:02