Come posso eliminare il testo prima di un delimitatore in Linux


16

Devo eliminare il testo da una riga prima del delimitatore.

Per esempio:

(123434): hello::{apple,orange,mango}.

Devo prima cancellare il testo :. vale a dire (123434).

Esiste un comando in Linux per eseguire questa attività?


Potresti voler esaminare sedoawk
Paul,

Questo testo fa parte di un file o fa parte di una variabile bash?
Bernhard,

Fa parte del file.
user80538

Risposte:


14

Questo sedcomando dovrebbe fare il trucco. Il seguente comando sovrascriverà il file:

sed -i 's/^[^:]*:/:/' file

Per stampare solo l'output, rimuovere il -iflag. Per inserire l'output in un nuovo file, rimuovere il -iflag e reindirizzare l'output:

sed 's/^[^:]*:/:/' file > new_file

La linea ha fatto la magia ... l'output è stato sostituito nel file stesso ..
user80538

quando confronto due file usando sdiff, dopo aver rimosso il testo da entrambi i file, la differenza mi mostra il testo rimosso per me. questo comando sovrascrive il file o mostra semplicemente l'output.
user80538

Ha funzionato .. Posso estrarre 'hello' e {apple, orange, mango} dal mio esempio apportando semplici modifiche nel comando sopra?
user80538

@ user80538, È difficile dire cosa vuoi quando dici estrai in questo contesto. Fa parte di uno script shell più grande? Potresti voler fare una nuova domanda con i dettagli del problema più grande che stai cercando di risolvere.
Dott.

È solo un semplice confronto tra due file con gli stessi dati, ma è necessario solo scoprire dove i dati differiscono in due file. Devo controllare ogni singola sezione della linea. I dati nelle singole sezioni possono essere confusi. come {mela, arancia, mango} può essere {mela, mango, arancia}.
user80538

14

Puoi usare cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Puoi farlo con un'istruzione Bash abbastanza semplice :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Questo stamperà : hello::{apple,orange,mango}.. Puoi tagliare prefissi e suffissi in modo simile. Inoltre, le definizioni di prefisso e suffisso possono contenere caratteri jolly.

Taglia prefisso - fino al primo prefisso corrispondenza jolly: ${variable#prefix}

Taglia prefisso: corrispondenza jolly fino all'ultimo prefisso: ${variable##prefix}

Cut suffix - fino alla prima corrispondenza jolly del suffisso: ${variable%suffix}

Taglia suffisso: corrispondenza jolly fino all'ultimo suffisso: ${variable%%suffix}

A prima vista potrebbe sembrare poco chiaro, vedere il seguente esempio:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

Nell'ultimo esempio, il modello non corrisponde, quindi nulla viene tagliato.


Sarebbe più robusto da usare echo ${mytext#*:}:. Questo gestirà correttamente le linee come (123)(434): hello::{apple,orange,mango}.e 123434: hello::{apple,orange,mango}.
Dott.

c'è un modo per modificare il comando echo $ {mytext %% B *} per ottenere testo dopo B. nel tuo esempio
user80538

@ user80538 sì, basta tagliare il testo prima di B, incluso ;-), ovvero: $ {mytext # * B} per il testo dopo la prima B e $ {mytext ## * B} per il testo dopo la seconda B.
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.