Elimina l'ultimo carattere in una parola, ma solo se il personaggio è lì - in bash


12

Come rimuovere l'ultimo personaggio solo se è lì?

ingresso:

OpenOffice.org/m
openOffice.org/ozm
Pers.
PFG.
phil.
Prof.
resp.
Roonstr./m
roonstr./ozm

output desiderato:

OpenOffice.org
openOffice.org
pers
PFG
phil
prof
resp
Roonstr
Roonstr

Ho capito che è rimasto solo il punto ma sfortunatamente l'ultimo comando sed rimuove anche la lettera g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

Risposte:


12

Devi solo sfuggire al punto nel tuo sedcomando e tutto andrà bene. Come questo:

sed 's/\.$//'

Perché nel caso in cui non ti sfugga, .$corrisponderà a qualsiasi carattere alla fine della stringa.

Inoltre puoi mettere tutti i tuoi sed+ grep+ cutin uno solo sed:

sed 's=/[^/]*$==;s/\.$//' filename

Ottimo, grazie, funziona! :) Uso un dizionario con oltre 300k righe quindi è per questo che utilizzo grep "\." per ottenere solo le parole con un punto lì.
rimozioneelastdotonlyifitsthere

sed anche in grado di farlo con smth come questo: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. Comunque grep+ sedfunzionerà molto più a lungo di uno solo sed.
corsa il

Se può essere fatto con una sola sed, sarebbe bello però. Come applicare il tuo ultimo comando sed?
rimozioneelastdotonlyifitsthere

sed 's/[./]\+[^./]*$//'
Peter

Grazie ora non ho bisogno di tagliare, ma grep è ancora lì. Un equivalente sed del mio comando grep convogliato rimuoverebbe quindi grep, se possibile, sarebbe carino. "Inoltre puoi mettere tutte le tue sed + grep + in una sola sed" non funziona per me, stampa tutte le parole?
rimozioneelastdotonlyifitsthere

1

Rimozione di un carattere solo se è presente esattamente la descrizione delle espansioni dei parametri.

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

Il punto non è speciale in questo caso (un punto è speciale in una regex).

L'altro modello potrebbe essere rimosso con %/*:

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

Per rimuovere entrambi:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

Naturalmente, per lavorare con un file sorgente è più veloce usare sed sul file.
Ricorda solo di citare il punto (per abbinarlo letteralmente, altrimenti significa: qualsiasi carattere).

 $ sed 's,/.*,,;s,\.$,,' file

Questa dovrebbe essere la risposta accettata. Ha bisogno di più voti.
David Parks,

0

Cambia leggermente la tua espressione regolare: per sfuggire al . E non hai bisognogrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
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.