Eliminare fino alla prima occorrenza del colon usando sed


16

Il mio comando sed è:

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

Deve tornare,

bcde:cdeaf

(vale a dire) tutti i caratteri prima dei primi due punti nella linea e i due punti stessi devono essere rimossi.

Ma questo non sta rimuovendo nulla.

La mia confusione deriva principalmente da,

1) Le parentesi per il pattern matching devono essere sfuggite all'interno di sed regex-es?

2) In entrambi i casi (con escape / no escpaing), non funziona. Provai,

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 

1
tu vuoi sed 's/[^:]*://'. E non stai deliminando la riga di input, a proposito, la stai modificando con un s///comando ubstitution. Devi sostituire il primo bit non i due punti e i due punti che lo seguono senza nulla.
mikeserv,

che risolve ... grazie, amico ... questo è un esempio che ho preso per imparare la corrispondenza dei pattern regex all'interno di sed ... quindi, sto cercando una risposta che usi la corrispondenza gruppo / pattern con le parentesi ...

3
Oppure, usando solo bash: printf "%s\n" "${line#*:}"...
jasonwryan,

1
@jasonwryan - buon punto, considerando la fonte di esempio. è sicuramente il modo più efficiente per gestirlo. ma se è un while read lineche ottiene il $line, probabilmente seddovrebbe essere preferito.
mikeserv,

Risposte:


23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

Il primo ^significa l'inizio della linea. L' [^:]unico modo in cui so come scrivere non due punti . Il *dopo il colon indica un numero qualsiasi di cose proprio davanti a me (in questo caso il non-colon). Infine, :seleziona i due punti.

In altre parole, seleziona l'inizio della riga, un numero qualsiasi di cose che non sono due punti e il primo punto.

Il //gmezzo elimina ogni istanza corrispondente.


3
non è necessario ^ancorare la partita, tranne perché si aggiunge anche una gbandiera lobal. ci può essere solo una prima occorrenza di un motivo, quindi la gbandiera lobal non rimuove tutti i [^:]*:motivi da una linea, come farebbe se non lo si ^ancorasse. piuttosto che complicare la regex con due flag inutili che servono solo a sbilanciarsi a vicenda, potresti semplicemente lasciarli fuori, che è ciò che la versione modificata di questa risposta ha dimostrato prima di rollback. perché insisti a diffondere informazioni negative non lo so, ma ciò rende una risposta negativa.
mikeserv,

@mikeserv, come ho già detto, grazie per averlo segnalato. Sinceramente apprezzo che mi aiuti a migliorare le mie sedcapacità. Sono nuovo sede non mi sento ancora a mio agio con la sintassi molto limitata che ho raccolto finora. Quella sed(eh), penso che la mia risposta risolva il problema di OP anche se non è la risposta ottimale (cioè la tua). Questo è Stack Exchange, non Wikipedia, quindi correggimi se sbaglio, ma se conosci una risposta migliore dovresti postarla in modo che le persone possano vedere la varietà di approcci e confrontarli. Per favore, non trasformare la mia risposta nella tua risposta con la funzione di modifica .
user1717828

4
non era la mia risposta. era la tua risposta, modificata. È tutto. ed è stato bello . non è più.
Mikeserv,

4

Per operare con le colonne c'è cut:

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

lo stesso

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

E altra versione con sed(più veloce per i big data):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

E piuttosto esotico in bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

o

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

o

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

Potresti anche aggiungere il modo corretto di farlo con sed, ovverosed 's/[^:]*://'
don_crissti,

@don_crissti La versione è indicata nella risposta sopra. Inoltre, a causa dell'uso di regexp , è più lento della compilazione dell'espressione in ogni riga.
Costas,

No non lo è. La risposta sopra fa schifo alla grande e merita molti voti negativi, soprattutto se leggi le revisioni e i commenti lì.
don_crissti,
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.