Comment diviser l'expression longue sed en plusieurs lignes?

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

Je voudrais diviser cette commande sur plusieurs lignes - fx quelque chose comme ceci:

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

L'utilisation \ou la séparation de chaînes n'a pas fonctionné.

Raffael
la source
C'est pourquoi Perl a le /xmodificateur de substitution.
choroba
1
@Networker: oui, merci, j'ai ajouté ma réponse là aussi
Raffael

Réponses:

8

Vous pouvez enregistrer une longue chaîne dans des variables bash, puis utiliser dans la sedcommande:

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

Si vous pouvez utiliser perl, vous pouvez rompre le motif long avec le xmodificateur:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file
cuonglm
la source
1
Pourquoi utilisez-vous autant de citations? sed "s/$string/$replace/" file.txtc'est bien.
Scott
1
Bien sûr, vous devez également supprimer l'espace après replace=.
Scott
8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

Le fractionnement sur plusieurs lignes avec barre oblique inverse fonctionne si les nouvelles lignes ne sont pas en retrait.

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

Testé sur Cygwin avec GNU sed 4.2.2

Raffael
la source
Quelle est votre version sed? Je teste avec GNU sed version 4.2.1et ça ne marche pas.
cuonglm
2
On dirait qu'il manque une barre oblique inversée à la fin de la première ligne, après la barre oblique?
Volker Siegel
7

Un autre aspect:

Les [long]éléments ci-dessus sont-ils maintenables ?

Plus les clauses sont courtes et distinctes, plus elles seront faciles à modifier et à améliorer au fil du temps et les faits (sed-external) changent autour de la fonction qu'ils fournissent.

par exemple

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] /' 

... pourrait être quelque chose à rechercher et à préférer.

Hannu
la source
4

Vous pouvez également décomposer cela de cette façon:

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

Ou peut-être comme:

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

Ou avec un hérédoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
mikeserv
la source