Dans le fichier suivant:
Lorem ipsum dolor assis amet, élit adipiscing consectetuer. Ut eu metus id lectus vestibulum ultrices. Maecenas rhoncus.
Je veux tout supprimer avant consectetuer
et tout après elit
.
Ma sortie souhaitée:
consectetuer adipiscing elit.
Comment puis-je faire ceci?
shell-script
text-processing
manuel
la source
la source
sed
. Cela peut aussi êtreperl
, ou même pur bash.Réponses:
J'utiliserais sed
Décodage de la syntaxe sed s / find / replace /:
s/^.*
- substitut commençant au début de la ligne (^
) suivi de n'importe quoi (.*
) jusqu'à ...\(
- démarrer un bloc nomméconsectetuer.*elit\.
- faire correspondre le premier mot, tout (.*
) jusqu'au dernier mot (dans ce cas, y compris le point de fin (échappé)) que vous souhaitez faire correspondre\)
- terminer le bloc nommé.*
) à la fin de la ligne ($
)/
- terminer la section de recherche de substitut\1
- remplacer par le bloc de nom entre le\(
et ce qui\)
précède/
- terminer le remplacementla source
^
ou$
puisque sed tentera de trouver la correspondance la plus longue. Vous pouvez également avoir raté le point aprèselit
, vous pouvez insérer\.
si nécessaire.^
et$
ne sont pas nécessaires - je les ai laissés là car le questionneur a noté (à l'origine) qu'il était un peu débutant et cela peut être utile dans d'autres contextes.Si chaque ligne contient à la fois début et motif de fin alors la meilleure façon de le faire est avec
grep
. Au lieu de supprimer le début et la fin de chaque ligne, vous pouvez simplement afficher le contenu entre les deux modèles. L'-o
option dans GNUgrep
ne produit que les correspondances:Remarque: comme mentionné, cela ne fonctionne que si chaque ligne du fichier peut être analysée de cette façon. Là encore, c'est 80% de tous les cas d'utilisation typiques.
la source
Deux pour les boucles dans AWK:
Gsub d'AWK:
la source
Une façon Perl. C'est essentiellement la même chose que la
sed
réponse de MikeV :Le
-p
moyen "imprime chaque ligne après avoir appliqué le script fourni avec-e
". Les/foo/bar/
est l'opérateur de substitution; il remplacerafoo
parbar
. Les parenthèses capturent un motif et utilisons-le dans le remplacement. Le premier motif capturé est$1
le second$2
et ainsi de suite.Ainsi, la commande fera correspondre tout jusqu'à
consectetuer
(.*consectetuer
), puis tout jusqu'àelit
(.*elit
) et tout le reste jusqu'à la fin de la ligne (.*
) et remplacera cela par le motif capturé.la source
Je ne sais pas pourquoi ce titre de question a été modifié " du fichier " en " d'une ligne " alors que l'OP n'exclut pas la possibilité sur plusieurs lignes même si l'exemple semble être une seule ligne. Quoi qu'il en soit, il pourrait être utile de fournir ici une solution à plusieurs lignes.
Cela fonctionne pour les lignes croisées:
Exemples:
référence: Expansion des paramètres du shell
la source