Come dividere la lunga espressione sed in più righe?


14
sed 's/[long1][long2]/[long3][long4]/' file.txt

Vorrei dividere questo comando su più righe - fx qualcosa del genere:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

L'uso \o la separazione delle stringhe non ha funzionato.



Ecco perché Perl ha il /xmodificatore da sostituire.
Choroba,

1
@Rete: sì, grazie, ho aggiunto anche la mia risposta lì
Raffael,

Risposte:


8

È possibile salvare una stringa lunga per bash le variabili, quindi utilizzare nel sedcomando:

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

Se puoi usare perl, puoi rompere il modello lungo con il xmodificatore:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file

1
Perché usi così tante citazioni? sed "s/$string/$replace/" file.txtè ok.
Scott,

1
Inoltre, ovviamente, è necessario eliminare lo spazio dopo replace=.
Scott,

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

La divisione su più righe con la barra rovesciata funziona se le nuove righe non sono rientrate.

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

Testato su Cygwin con GNU sed 4.2.2


Qual è la tua versione sed? Provo con GNU sed version 4.2.1e non funziona.
cuonglm,

2
Sembra che manchi una barra rovesciata alla fine della prima riga, dopo la barra?
Volker Siegel,

6

Un altro aspetto:

Quanto sono mantenibili gli [long]articoli sopra?

Più brevi e distinti si possono mantenere le clausole, più sarà facile cambiarle e migliorarle col passare del tempo e i fatti (sed-esterni) cambiano attorno alla funzione che forniscono.

per esempio

sed \
-e 's / [minimal-s1] / [minimal-r1] /' \
-e 's / [minimal-s2] / [minimal-r2] /' \
-e 's / [minimal-s3] / [minimal-r3] /' \
-e 's / [minimal-s4] / [minimal-r4] /' 

... potrebbe essere qualcosa per cui lottare e preferire.


4

Puoi anche suddividerlo in questo modo:

sed '/[long1][long2]/
    s//[long3][long4]/'

O forse piace:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

O con una eredità:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
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.