12
votes

Comment supprimer un préfixe de mot en utilisant Grep?

Comment puis-je supprimer le début d'un mot en utilisant grep? Ex: J'ai un fichier contenant: xxx

J'ai seulement besoin de la partie xxx

désolé pour la question de base. Mais n'avez aucune expérience avec Linux.


1 commentaires

Utilisez Sed au lieu de grep.


6 Réponses :


3
votes

grep n'est pas utilisé pour manipuler / modifier le texte, uniquement pour rechercher des textes / motifs dans le texte

Vous devriez examiner quelque chose comme sed ou awk ou couper si vous souhaitez qu'un outil de ligne de commande le fasse. Ou écrire un script à Python / Perl / Ruby / Whase.


0 commentaires

12
votes

Vous ne modifiez pas les chaînes avec grep dans UNIX Shell, grep est généralement utilisé pour rechercher ou supprimer certaines lignes du texte. Vous préférez utiliser sed à la place: xxx

vous devez apprendre des expressions régulières pour l'utiliser efficacement .

SED peut également modifier le fichier en place (modifier le fichier), si vous passez -i < / Code> Argument, mais soyez prudent, vous pouvez facilement perdre des données si vous écrivez la commande erronée sed et utilisez -i drapeau.

un exemple

de vos commentaires devinez que vous avez un document TEX et que vous souhaitez supprimer la première partie de tous les noms de domaine .com. Si c'est votre document test.tex : xxx

alors vous pouvez le transformer avec cette commande sed (sortie de redirection Pour déposer ou modifier en place avec -i ): xxx

Veuillez noter que:

  • Une séquence commune des symboles autorisés suivis d'un point est assorti par [A-Z0-9 -] \ + \ \.
  • J'ai utilisé des groupes dans l'expression régulière (parties de celui-ci dans \ ( et \ \) ) pour indiquer la première et la deuxième partie de l'URL, et je remplace tout le match avec son deuxième groupe ( \ 2 dans le motif de substitution)
  • Le domaine doit être au moins 3ème niveau .com Domain (chaque référence \ + signifie au moins une correspondance)
  • La recherche est insensible à l'affaire ( i drapeau à la fin)
  • Il peut faire plus que correspondoir par ligne ( g drapeau à la fin)


5 commentaires

Les URL sont enregistrées dans un fichier. Donc, ma commande sera: grep '\. Com $' source.text> dest.tex | sed 's /^[^\\]\+\.//' ?? Ça me donne une erreur ??


J'ai aussi besoin d'écrire les noms (ce sont de nombreuses lignes non une) dans un autre fichier texte après avoir supprimé www.


J'ai essayé de deviner quelle est votre tâche et a écrit un exemple d'un SED regex pour éditer des noms de domaine dans le document, sans toucher le reste des lignes. Si votre problème est différent, vous aurez peut-être besoin d'une différence différente, mais dans l'ensemble, l'idée est la même.


Normalement, vous refaire soit le fichier (> dest.tex ) ou simplement utiliser le tuyau ( | sed ... ), mais pas les deux. Vous n'avez pas besoin grep si vous souhaitez modifier certaines lignes mais gardez le reste. Une regex soigneusement écrite et sed est probablement tout ce dont vous avez besoin.


Sur la commande MacOS, la commande sed ne fonctionne pas identique à la version Linux. Mais vous pouvez utiliser cette version plus simple sur le Mac, sans expressions régulières: echo www.example.com | SED "S / www .// "< - il remplacera " www. " avec la chaîne vide " ".



4
votes

Comme les autres ont noté, grep code> n'est pas bien adapté à cette tâche, sed code> est une bonne option ou si le texte est bien commandé un simple CUT code> peut être plus facile à taper:

echo www.abc.com | cut -d. -f2-
  • -d. code> indique couper code> pour utiliser . code> comme délimiteur. li>
  • -f2 - code> indique couper code> pour renvoyer le champ 2 à l'infini. Li> ul> p>


0 commentaires

6
votes

Vous pouvez le faire en utilisant grep facilement: xxx

au lieu de echo Vous devez donner votre fichier. < Pré> xxx

J'ai utilisé ici l'expression régulière '[^.] *. Com'. Cela signifie: trouvez-moi un mot sans . dans celui-ci ( [^.] * ), après quoi .com ( \ .com en re). La touche -o indique que grep ne doit afficher que cette partie trouvée.


0 commentaires

0
votes

Vous pouvez réellement faire cela sans appeler d'autres programmes, en utilisant une expansion de paramètres intégrée dans Bash: xxx

# *. indique à la coquille de retirer le préfixe qui ressemble à 0 ou plusieurs caractères suivis d'un . .

Vous pouvez afficher une feuille de triche avec les différentes extensions de paramètres pour bash ici:

https://devhintS.io/bash


0 commentaires

4
votes

avec de Grep - Seul-correspondant code> et \ k code>

Vous pouvez le faire avec un de Grep - Seul-correspondant code> drapeau : p> xxx pré>

qui peut être raccourci vers p> xxx pré>

les deux commandes produisent p>

abc.com p> blockquote>

avec grep (gnu grep) 3.3. p>

au lieu de echo code>, je vais utiliser un ici String Pour raccourcir la commande en outre: p> xxx pré>

\ k code> réinitialise le point de départ du match, oubliant essentiellement le "www". ". Voir Ce pour plus d'informations sur \ k code> . P>

avec l'apparence positive de Grep h1>

Vous pouvez également le faire avec un LOOKEDEWIND POSITIVE : P>

awk -F 'www.' <<< "www.abc.com" '$2{print $2}'


0 commentaires