2012-08-30 21 views
14

Ho una stringa da cui voglio rimuovere la punteggiatura.Come posso sostituire [] parentesi con SED

Ho iniziato con

sed 's/[[:punct:]]/ /g' 

ma ho avuto problemi su HP-UX non gradire che tutto il tempo, e alcune volte vorrei avere un nulla 0 e dopo un $ nella mia stringa sarebbe dissappear. Così ho deciso di provare a farlo manualmente.

Ho il seguente codice che funziona su tutti i miei segni di punteggiatura a cui sono interessato, tranne che non riesco ad aggiungere parentesi quadre "[]" al mio sed con nient'altro, altrimenti non sostituisce nulla, e io non ottenere un errore, quindi non sono sicuro di cosa risolvere.

In ogni caso questo è ciò che attualmente ho e vorrei aggiungere [] a.

sed 's/[-=+|[email protected]#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g' 

BTW sto usando KSH su Solaris, RedHat & HP

+0

Il punto e virgola in ": punct;" un errore di battitura? –

+1

Perché stai usando sed per questo? Per sostituire un grande gruppo di caratteri con uno spazio, è meglio usare 'tr'. –

+0

@Will - sì che è un errore di battitura .... non riesco a modificare il mio OP. Come utilizzerei tr per sostituire la mia punteggiatura con gli spazi? Ho provato a usare [: punct:] con TR e SED senza alcun risultato. – nitrobass24

risposta

1

Ecco il codice finale ho finito con

`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'` 

ho dovuto mettere = e - a proprio alla fine

19

È necessario inserire le parentesi all'inizio nell'espressione:

sed 's/[][=+...-]/ /g' 

Posizionando il ']' come primo carattere immediatamente dopo la parentesi di apertura, viene interpretato come membro del set di caratteri anziché come parentesi di chiusura. Posizionando un '[' ovunque all'interno delle parentesi si diventa membri del set.

Per questo particolare set di caratteri, è necessario occuparsi anche di - in particolare, poiché non si sta tentando di creare un intervallo di caratteri compreso tra [ e =. Quindi metti lo - alla fine della classe.

+0

Sì ... è quello che pensavo inizialmente, ma quando l'ho fatto ho sempre ricevuto un errore di fine gamma non valido echo word1 $ word2 | sed 's/[] - = + | ~! @ # \ $%^& *() {}:;' \ '' '\ "' '\'' '\.' '\ /' '\\' []// g ' sed: -e espressione # 1, char 36: intervallo non valido fine – nitrobass24

+0

L'intervallo non valido è a causa di '-'. Quando' -' appare nel mezzo, sed sta cercando di creare un intervallo di caratteri, utilizzare '\ -' invece –

+0

Il' -' deve essere la prima posizione del carattere nella classe di caratteri per rappresentare un trattino altrimenti potrebbe essere interpretato come un metacarattere di classe di caratteri che indica un intervallo di caratteri. – potong

3

È inoltre possibile specificare i caratteri che si desidera conservare [con inversione]:

sed 's/[^a-zA-Z0-9]/ /g' 
+0

Questo è qualcosa che non avevo nemmeno realizzato era possibile Sembra funzionare piuttosto bene, tranne quando c'è un "$" nella mia stringa ... qualsiasi cosa dopo che "$" è stato rimosso. echo word 1 $ word2 | sed 's/[^ a-zA-Z0-9]// g'' e il mio risultato era 'word1' – nitrobass24

+2

è la shell che interpreta' $ word2' come variabile, prova' echo 'word1 $ word2'' o 'echo word1 \ $ word2' – perreal

+0

Quello che ho finito per fare è stato salvare la mia stringa come variabile ... quindi passare la variabile tra virgolette. 'echo" $ stringa "| sed 's/[^ a-zA-Z0-9]// g'' – nitrobass24

2

È possibile farlo manualmente:

sed 's/[][\/$*.^|@#{}~&()_:;%+"='\'',`><?!-]/ /g' 

Questa rimuovere il carattere di 32 punteggiatura, l'ordine di alcuni personaggi è importante:

  • - dovrebbe essere alla fine come questo -]
  • [] dovrebbe essere così [][other characters]
  • ' deve essere sfuggito come quella '\''
  • non inizia con ^ come in [^
  • non cominciare con [.[=[: e terminare con .]=]:]
  • si esaurisce con $]

qui si può avere spiegazione del perché tutto che http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03

0

Può essere una mano condotto utilizzando anche la tecnica di regex capture (ad esempio: qui sotto):

echo "narrowPeak_SP1[FLAG]" | sed -e 's/\[\([a-zA-Z0-9]*\)\]/_\1/g' 
> narrowPeak_SP1_FLAG 

\[ : literal match to open square bracket, since [] is a valid regex 
\] : literal match to square close bracket 
\(...\) : capture group 
\1 : represents the capture group within the square brackets