Domanda

Sto cercando di creare un comando di sostituzione regex in Script Bash, ma dopo aver giocato con virgolette singole, doppie virgolette e personaggi di fuga, mi sto tirando fuori i capelli. Uso Regexr per comporre i modelli e sono venuti in seguito a:

Cerco:

/\.icon-(.*) {\n\t/gm
.

e vuoi sostituirlo con:

if(strpos(\$embedicons,'$1') !== false) { \$svgicons .= <<<'EOD'\n\.$1 {
.

Questo sostituisce questo:

.icon-basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}
.

Con questo:

if(strpos($embedicons,'basket-14-icon') !== false) { $svgicons .= <<<'EOD'
.basket-14-icon {background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}
.

Tuttavia, sono piuttosto infruttuoso nel farlo accadere all'interno di uno script bash. Non sono sicuro che sia rilevante, ma sono su OSX Mavericks e usa l'app terminal. Mentre i modelli di regexr hanno senso per me, una volta iniziato a sfuggerlo, perdo completamente la traccia di ciò che sta succedendo.

    .
  1. Come assicurarsi che il regex sia globale e multilinea?
  2. è meglio usare un'altra opzione rispetto a quella di Builtin Regex?
  3. C'è una risorsa online che insegna (bash) regex per completare i noobs?
  4. c'è un modello di gruppo che corrisponde a tutto (compreso spazi bianchi e Newlines) fino a una determinata catena di personaggi come un asterisco (*)?
  5. Ovviamente non sto cercando un dispensatore, poiché questo problema mi perseguita regolarmente ... Mi piacerebbe imparare Regex e risolvere i miei problemi imparando e ho studiato alcuni esempi online, ma sembrano troppo avanzati. Forse c'è un generatore online come il regexr che si traduce in versioni compatibili compatibili e PHP di BASH dei modelli di regex?


    .

    Aggiornamento / Soluzione:

    Il seguente sembra funzionare per me nel terminale OSX Mavericks:

    sed "s|\.icon-\(.*\) {|if(strpos(\$embedicons,'\1') !== false) { \$svgicons \.= <<<'EOD' \.\1 {|g"
    
    .

È stato utile?

Soluzione

Suggerirei di utilizzare sed per questo tipo di sostituzione, questa linea farà ciò che desideri:

sed "s/^.icon-\(.*\) {$/if(strpos(\$embedicons,'\1') !== false) { \$svgicons .= <<<'EOD'\n.\1 {/"g input_file.txt
.

ingsp_file.txt:

.icon-basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}
.

Uscita:

if(strpos($embedicons,'basket-14-icon') !== false) { $svgicons .= <<<'EOD'
.basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}
.

Con il set di flag -r (Extended Regex), è necessario sfuggire alle parentesi graffe letterali e ai segni del dollaro variabile nell'esempio.

Per quanto riguarda le tue domande:

    .
  • Il flag g per sed lo rende globale. Cosa intendi esattamente per "multilinea"? L'emissione delle nuove linee è facile usare \ n, corrispondente alle linee è un po 'più complessa come sed opera in linea. Una tecnica comune è quella di sostituire tutte le nuove linee nel file / dati con un segnaposto, eseguire la regex / sostituzione con il segnaposto in mente, quindi sostituire nuovamente il segnaposto con le nuove linee.
  • sed è probabilmente la soluzione migliore per roba di tipo regex. Puoi trovare la documentazione online, questo è abbastanza completo: http://www.grimoire.com/unix/ Sed.html

Per l'ultima parte, utilizzando (.*) Capisci tutto, devi solo gestire le nuove linee e assicurarsi di sfuggire alla corda di terminazione correttamente.

TestFile:

testing data with space -
and newlines /'\ *** ends
there
.

Comando (tr sta scambiando nuove linee per Tildes e Ritorno di nuovo):

tr '\n' '~' < testfile | sed -r 's/(.*)\*\*\*.*/\1/g' | tr '~' '\n'
.

Uscita:

testing data with space -
and newlines /'\ 
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top