Come posso rimuovere i primi X caratteri dalla stringa usando sed?


126

Sto scrivendo script di shell per Linux incorporato in una piccola scatola industriale. Ho una variabile che contiene il testo pid: 1234e voglio rimuovere i primi X caratteri dalla riga, quindi rimangono solo 1234. Ho più variabili che devo "ripulire", quindi ho bisogno di tagliare X primi caratteri e ${string:5}non funziona per qualche motivo nel mio sistema.

L'unica cosa che sembra avere la scatola è sed.

Sto cercando di far funzionare quanto segue:

result=$(echo "$pid" | sed 's/^.\{4\}//g')

Qualche idea?


10
Se ${string:5}non funziona, non stai usando Bash o un'altra shell che supporti quella sintassi. Quale shell e versione stai usando? Che aspetto ha il tuo shebang? La mia ipotesi è che stai usando sh(come dash) o forse zsh.
In pausa fino a nuovo avviso.

Risposte:


0

Questo farà anche il lavoro:

echo "$pid"|awk '{print $2}'

27
Questa è la prima domanda per "salta i primi N caratteri nella stringa". Non hai risposto alla domanda.
dal

Questo non sembra funzionare, e se lo fa, puoi spiegare come
Alexander Mills,

Funziona sul mio sistema. Potrebbe esserci un problema con il separatore di campo, provare awk -F": " '{print $2}'. Tuttavia, non è la mia soluzione preferita.
mzuther,

197

Quanto segue dovrebbe funzionare:

var="pid: 1234"
var=${var:5}

Sei sicuro che bashla shell stia eseguendo il tuo script?

Anche conforme a POSIX

var=${var#?????}

sarebbe preferibile utilizzare un processo esterno, sebbene ciò richieda di codificare il 5 sotto forma di un modello a lunghezza fissa.


1
Puoi anche specificare la lunghezza con un secondo parametro: ${var:5:2}inizierà a 1e ritornerà 12.
Max Candocia,

108

Ecco un metodo conciso per tagliare i primi X caratteri usando cut(1). In questo esempio vengono rimossi i primi 4 caratteri tagliando una sottostringa che inizia con il 5 ° carattere.

echo "$pid" | cut -c 5-

2
Questa è la soluzione più semplice!
Brandon,

2
Tecnicamente l'OP ha chiesto sed, ma penso che questa sia la soluzione migliore per "Come posso rimuovere i primi X caratteri dalla stringa [in un terminale / bash]" Se usato in combinazione con git, è bello:git log --pretty=oneline | cut -c 42- | head
Marksiemers

1
+1 Soluzione semplice e utile. Quando ho avuto l'URL come http: // <esempio.com> e per tagliare il protocollo "http: //" devo dire come 8 caratteri anziché 7. Non lo so , ma è così che ha funzionato per me.
Santosh Kumar Arjunan,

1
Santosh Kumar Arjunan: questo perché l'esempio "echo" $ pid "| cut -c 4-" in realtà non sta tagliando i primi 4 caratteri ma estrae la sottostringa a partire dal 4 ° carattere. Pertanto taglia effettivamente i primi 3 caratteri. Quindi, se vuoi tagliare 7 primi personaggi, vuoi estrarre tutto dall'ottavo carattere e quindi effettivamente "tagliare -c 8-"
al-ash

1
@DeanHiller cut -c ${LEN}-. Le parentesi graffe vengono utilizzate per concatenare la stringa con caratteri variabili validi, al fine di distinguere ciò che è la variabile e ciò che non lo è. Se vuoi maggiori informazioni su questo, cerca "concatenazione di stringhe di variabili bash" per maggiori risorse su perché / come funziona.
JustCarty,

46

Utilizzare l' -ropzione ("usa espressioni regolari estese nello script") sedper utilizzare la {n}sintassi:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234

1
come sarebbe il caso, se volessi rimuovere gli ultimi X caratteri da una stringa?
Kokesh,

5
@Kokesh: puoi invece sed -r 's/.{5}$//'eliminare gli ultimi 5 caratteri
Mark Longair il

7
Puoi farlo senza il -r( -Ein OS X, IIRC) se sfuggi alle parentesi graffe (non so se funziona in OS X, però).
In pausa fino a nuovo avviso.

2
@Dennis: ho appena controllato - sfuggire alle parentesi graffe (e lasciare -r/ / -E) funziona in OS X.
Gordon Davisson

15

Taglia i primi due caratteri dalla stringa:

$ string="1234567890"; echo "${string:2}"
34567890

@ dtp70 Grazie mille per una risposta generica, ha funzionato benissimo!
Wolfram77,

10

reindirizzalo awk '{print substr($0,42)}'dove 42 è uno in più del numero di caratteri da rilasciare. Per esempio:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$

8

È probabile che lo avrai anche tu cut. Se è così:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234

1
Il problema cutè che non gestisce le sequenze di spazi bianchi in modo sensato, l'uso tr -s ' 'di "spremere" gli spazi lo fa comportare meglio.
Thor,

1
Non è pensato per essere uno strumento che canta tutto ballando; è semplice e fa come dice sulla lattina ed è ampiamente disponibile. Dovrebbe funzionare bene per tali requisiti ed è sicuramente più robusto che ritagliare caratteri fissi da posizioni specifiche.
Shawn Chin,

5

Beh, ci sono state le soluzioni qui con sed, awk, cute utilizzando bashla sintassi. Voglio solo aggiungere un'altra variante conforme a POSIX:

$ echo "pid: 1234" | tail -c +6
1234

-cdice alla coda a quale offset di byte iniziare, contando dalla fine dei dati di input, ma se il numero inizia con un +segno, è dall'inizio dei dati di input fino alla fine.


4

Un altro modo, usando cutinvece di sed.

result=`echo $pid | cut -c 5-`

Vuole rimuovere i primi 4 personaggi. Questo ottiene i primi 4 caratteri.
MM.

2

Ho trovato la risposta in puro sed fornita da questa domanda (è vero, pubblicata dopo che questa domanda è stata pubblicata). Questo fa esattamente quello che hai chiesto, esclusivamente in sed:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

Il punto in sed '/./) è qualunque cosa tu voglia abbinare. La tua domanda è esattamente quello che stavo tentando di fare, tranne nel mio caso che volevo abbinare una riga specifica in un file e poi decommentarla. Nel mio caso era:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

Di -iseguito sedè modificare il file in atto (rimuovere questa opzione se si desidera testare l'espressione corrispondente prima di modificare il file).

(L'ho pubblicato perché volevo farlo interamente con sed quando questa domanda è stata posta e nessuna delle risposte precedenti ha risolto il problema.)


1

Invece di rimuovere n caratteri dall'inizio, forse potresti semplicemente estrarre direttamente le cifre. Così...

$ echo "pid: 1234" | grep -Po "\d+"

Questa potrebbe essere una soluzione più solida e sembra più intuitiva.

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.