Aggiungi spazio prima della lettera maiuscola


8

Ho una stringa:

AddData
TestSomething
TellMeWhoYouAre

e così via. Voglio aggiungere spazio prima delle lettere maiuscole. Come posso farlo?


7
Cosa vuoi fare quando ci sono lettere maiuscole consecutive? esempioIClimbALadder
glenn jackman,

1
In realtà ho una stringa come ReadFileFromCDDrivee la soluzione di @Kusalananda funziona alla grande.
HeroFromEarth

Risposte:


16

Usando sede supponendo che tu non voglia uno spazio davanti alla parola:

$ sed 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' file.in
Add Data
Test Something
Tell Me Who You Are

La sostituzione cercherà una lettera maiuscola immediatamente successiva a un altro carattere non bianco e inserirà uno spazio tra i due.

Per stringhe con più di un carattere maiuscolo consecutivo, come WeAreATeam, questo produce We Are ATeam. Per ordinare questo, eseguire la sostituzione una seconda volta:

$ sed -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' \
      -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' file.in

1
Questa risposta non aggiungerà uno spazio prima di una lettera maiuscola se è preceduta da una lettera maiuscola. Perché scriverlo in questo modo, quando l'OP non ha posto alcuna limitazione in tal senso?
LarsH,

@LarsH Risolto il problema.
Kusalananda

No non l'hai fatto. Non puoi avere corrispondenze sovrapposte a una regex, anche con una gbandiera. Prova echo ThisIsATest | sed 's/\(.\)\([[:upper:]]\)/\1 \2/g'(il tuo comando) per capire perché non funziona.
Wildcard

@Wildcard Wonky, ma funziona. Hai un suggerimento migliore utilizzando BRE?
Kusalananda

In realtà non dice spazio all'inizio, quindi s/[A-Z]/ \0/gè del tutto soddisfacente ... `s / [AZ] / \ 0 / g; s / ^ // 'se ti interessa davvero.
Michael Homer,

12

Perl, usando le espressioni regolari a larghezza zero di lookbehind e lookahead:

$ perl -pe 's/(?<=\w)(?=[A-Z])/ /g'  file.in 

Tell Me Who You Are                    ## TellMeWhoYouAre
I Am A Regular Expression User         ## IAmARegulaExpressionUser

Questa versione separa anche lettere maiuscole consecutive.


1
Questo si trasforma ReadFileFromUSBDrivein ciò Read File From U S B Driveche l'OP voleva Read File From USB Drive.
Kusalananda

1
@Kusalananda, grazie per averlo sottolineato. (Temo di non vederlo scritto nella domanda). In situazioni reali (comprensione della programmazione, espansione delle parole identificative e varianti di CamelCase) è comune utilizzare un criterio di base (diviso in maiuscolo o contrario) e disporre di un dizionario di eccezioni.
JJoao,

1
Scusate, era qualcosa che l'OP ha scritto nei commenti alla mia risposta. Sono d'accordo, è difficile farlo senza un elenco di parole di qualche tipo.
Kusalananda


0

Soluzione Python:

#!/usr/bin/env python
from __future__ import print_function
import sys

with open(sys.argv[1]) as f:
    for line in f:
        for char in line:
            if char.isupper():
               print(" "+char,end="")
            else:
               print(char,end="")

Prova:

$ ./add_space_to_upper.py input.txt                        
 Add Data
 Test Something
 Tell Me Who You Are

Si desidera print(line[0], end="")seguire for char in line[1:]:per evitare di stampare quello spazio indesiderato all'inizio di ogni riga di output.
Paul Evans,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.