web-dev-qa-db-fra.com

Comment pouvons-nous enlever le texte du début à un mot particulier sélectionné en utilisant la commande sed de linux

J'ai une requête simple liée à la sélection et au remplacement de texte sous Linux. J'utilise la commande sed. J'ai le texte suivant:

bonjour tout le monde, je ne suis qu'un simple texte à afficher.

Maintenant, je veux imprimer sur "hello world" seulement je peux le faire en utilisant la commande suivante sous linux.

echo "hello world, I am just simple text for display." | sed 's/, I am.*//g'

Maintenant, je veux totalement l'inverse de cette fonction, comment puis-je supprimer "hello world" en utilisant une commande simple, tout comme sed.

Sortie requise:

, Je ne suis qu'un simple texte à afficher.

Je préférerais que les commandes linux (sed etc) soient utilisées.

4
Muhammad Abdullah

Pour inverser l'effet de votre commande ET conserver la même partie de la chaîne à faire correspondre (en supposant qu'il s'agit de la seule partie fixe de la chaîne et que vous souhaitez supprimer toute autre partie pouvant varier), vous pouvez procéder comme suit:

echo "hello world, I am just simple text for display." | sed 's/^.*\(, I am.*\)/\1/g'

Résultat :

, I am just simple text for display

Que fait l'expression régulière:

  • ^. *: correspond à n'importe quel caractère au début de la chaîne jusqu'à l'expression suivante
  • \ (& \): pour attraper la partie de la chaîne qui correspond à l'expression entre (doit être échappé par\ou ils correspondront au caractère entre parenthèses).
  • , Je suis. *: Le match que vous nous donnez,
  • \ 1: sera remplacé par le résultat de la correspondance de la première sous-expression entre parenthèses

De cette façon, vous avez exactement l'effet inverse de la commande dans votre question, en utilisant la même partie de la chaîne pour faire la correspondance.

5
Benoit

$ echo "hello world, I am just simple text for display." | sed 's/^hello world//' , I am just simple text for display.

Explication: dans sed (et ailleurs, comme dans vim), utilisez carat (^) pour indiquer le début de la ligne. La substitution supprime uniquement ce texte.

1
Andrew

Vous pouvez utiliser l'option sed __s. La commande sera,

echo "hello world, I am just simple text for display."|sed 's/.*, //g'

donne

I am just simple text for display.

Explication

  • .* correspond à un nombre quelconque de caractères
  • ,<space> correspond, et espace
  • Donc, la combinaison .*,<space> correspond à tout ce qui précède et à l'espace, y compris les deux, et ne les remplace par rien.
1
Registered User