Je vais soumettre un formulaire en utilisant cURL, où une partie du contenu provient d'un autre fichier, sélectionné en utilisant sed
Si le param1
modèle de correspondance de ligne d'un autre fichier utilise sed
, la commande ci-dessous fonctionnera correctement:
curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit
Maintenant, allez au problème. Je souhaite afficher uniquement le texte entre 2 motifs correspondants à l'exclusion du motif correspondant lui-même.
Disons que file.txt
contient:
Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
Actuellement, beaucoup de commandes "entre 2 motifs de correspondance" sed
ne supprimeront pas firstmatch
et secondmatch
.
Je veux que le résultat devienne:
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
text-processing
sed
lokomika
la source
la source
Réponses:
Voici une façon de procéder:
Expliqué: De la première ligne à la ligne correspondant à la première correspondance , supprimez. De la ligne correspondant à la seconde correspondance à la dernière ligne, supprimez.
la source
En awk:
la source
L'autre
sed
solution échouera si ellefirstmatch
se produit sur la 1ère ligne 1 .Restez simple, utilisez une seule plage et un regex 2 vide :
soit imprimez tout dans cette plage à l'exclusion des extrémités de la plage (impression automatique désactivée) 3 :
ou, plus court, supprimez tout ce qui n'est pas dans cette plage et supprimez également les extrémités de la plage:
1: La raison étant que si la deuxième adresse est une expression rationnelle, la vérification de la correspondance de fin commencera par la ligne suivant la ligne qui correspond à la première adresse .
Par conséquent,
/firstmatch/
n'est jamais évalué pour la 1ère ligne de l'entrée, lased
supprimera simplement car elle correspond au numéro de ligne1,/RE/
et passe à la 2ème ligne où elle vérifie si la ligne correspond/firstpattern/
2: Lorsqu'un REGEX est vide (c'est-à-dire
//
)sed
se comporte comme si le dernier REGEX utilisé dans la dernière commande appliquée (soit comme adresse soit comme partie d'une commande de remplacement) était spécifié.3: la
;}
syntaxe est pour lessed
implémentations modernes ; avec les plus anciens, utilisez soit une nouvelle ligne au lieu du point-virgule, soit des expressions séparées, par exemplesed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile
la source
//
se passe (à l'intérieur du{…}
)?//
signifie la dernière expression régulière utilisée; de tout ce que j'ai lu, ça devrait être/secondmatch/
. J'ai vérifié en testant que votre commande fonctionne, et j'ai donc conclu qu'elle fonctionne comme/firstmatch|secondmatch/
(ce que vous avez confirmé), mais je ne trouve aucune documentation (pas même le document POSIX auquel vous avez lié ou le GNU sed manuel ) qui décrit ce comportement. … (Suite)sed
: (1) Si je le fais/first/,4
, alors je me//
comporte comme/first/
. (2) Si je le fais2,/second/
,//
obtient alors une erreur «aucune expression régulière précédente». (Je trouve que c'est un échec flagrant de suivre le comportement spécifié.) (3) L'ajout--posix
ne change rien à ce qui précède. (II) Dans d'autres programmes: (4) Dansvi
, après/first/,/second/
, des//
actes comme/second/
(et les autres formes sont également des implémentations rationnelles de la règle documentée). … (Suite)awk
semble avoir aucune notion de «la dernière RE utilisée»;//
fait référence au non-caractère avant ou après n'importe quel caractère. (Je vous invite à essayerecho -- | awk '{ gsub(//, "cha"); print }'
.)/first|second/
. Quel chanceux êtes-vous. Je mentionne les autres programmes pour démontrer qu'il ne s'agit pas d'une convention regex à l'échelle du système. Celui qui l'a ajoutésed
n'a pas pris la peine de l'ajoutervim
, où cela aurait été tout aussi logique. :-)