sostituisce l'ennesima occorrenza della stringa in ciascuna riga di un file di testo


15

Ho file di testo di grandi dimensioni con stringhe delimitate da spazi (2-5). Le stringhe possono contenere "'" o "-". Vorrei sostituire il secondo spazio con una pipa.

Qual è il modo migliore per andare?

Usando sed stavo pensando a questo:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Altre idee / migliori / più semplici?

Risposte:


22

È possibile aggiungere un numero alla fine del comando sostitutivo. Ad esempio, quanto segue sostituirà la seconda occorrenza di oldcon la stringa newsu ciascuna riga di file:

sed 's/old/new/2' file

Quindi, invece della soluzione proposta, puoi utilizzare:

sed 's/ /|/2'

Per ulteriori informazioni, vedere ad esempio questo tutorial sed .


2
Dal sedfile di informazioni: "Nota: lo standard POSIX non specifica cosa dovrebbe accadere quando si mescolano le g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across implementazioni di sed. Per GNU` sed ', l'interazione è definita come: ignora le corrispondenze prima del NUMBERth, quindi abbina e sostituisce tutto partite dal NUMBERth in poi ".
In pausa fino a ulteriore avviso.

File informativi ... li odio. Comunque, ho rimosso la parte ambigua. Buon commento, +1.
mrucci,

1
Grazie, mrucci e Dennis. Ho pensato che ci doveva essere qualcosa di semplice là fuori.
dnkb,

Sembra che ogni problema che ho con la manipolazione del testo, riesco a risolvere sed. Non sono sicuro che dovrei ringraziarti per sedavermi reso ancora più utile, ma lo farò comunque. ;)
Jamie

1

Hai provato la tua versione? Ha funzionato? Perché penso che sia sostanzialmente una buona idea. Vorrei fare leggermente diversamente, però:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Questo accetterà qualsiasi carattere in una parola che non sia spazio e accetterà più di uno spazio tra le prime due parole.

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.