2016-08-30 1 views
0

Je dois remplacer chaîne suivanteRechercher et remplacer chaîne de fichier texte Ubuntu

//@Config(manifest 

avec chaîne ci-dessous,

@Config(manifest 

Donc, j'ai créé suivant regex

\/\/@Config\(manifest 

Et essayé

grep -rl \/\/@Config\(manifest . | xargs sed -i "\/\/@Config\([email protected]\(manifest/g" 

Mais je reçois l'erreur suivante:

sed: -e expression #1, char 38: Unmatched (or \(

Je dois chercher récursive et faire cette opération, bien que je suis coincé avec l'erreur ci-dessus.

+0

pourquoi supplémentaire 'manifeste $'? – piyushj

+0

Cela a été ajouté par erreur, supprimé tout en obtenant la même erreur –

+0

pouvez-vous même mettre à jour l'erreur à nouveau, comme la valeur char changer – piyushj

Répondre

2
grep -rl '//@Config(manifest' | xargs sed -i 's|//@Config(manifest|@Config(manifest|g' 
  • Spécification . pour le répertoire courant est en option pour grep -r
  • sed permet un caractère autre que backslash ou saut de ligne à utiliser comme séparateur

Modifier

Si nom de fichier contient des espaces, utilisez

grep -rlZ '//@Config(manifest' | xargs -0 sed -i 's|//@Config(manifest|@Config(manifest|g' 

Explication (suppose version GNU de commandes)

  • grep

    • -r effectue la recherche récursive
    • -l l'option OUTP uts uniquement les noms de fichiers au lieu des modèles adaptés
    • -Z délivre un zéro octet (caractère ASCII NUL) après chaque nom de fichier au lieu de saut de ligne habituelle
    • 'pattern' par défaut, grep utilise BRE (expression régulière de base) où des personnages comme ( font ne pas avoir une signification particulière et par conséquent ne doivent pas être échappées
  • xargs -0 dit xargs pour séparer les arguments par le caractère ASCII NUL

  • sed

    • -i modifier enplace de, utilisez -i.bkp si vous voulez créer une sauvegarde des fichiers originaux
    • s|pattern|replace|g le drapeau g dit sed pour rechercher et remplacer toutes les occurrences. sed également par défaut à BRE et donc pas besoin d'échapper (. L'utilisation \( signifierait début des groupes de capture et donc l'erreur quand il ne trouve pas la fermeture \)
+0

il ne fonctionne pas pour les répertoires récursifs si n'importe quel répertoire a de l'espace dans son nom –

+1

Merci, cela a fonctionné, mais ce serait génial si vous expliquez la commande dans la réponse afin que d'autres puissent le comprendre facilement et il améliorera également la qualité de réponse –

+1

Merci pour améliorer la qualité de réponse, cela aiderait beaucoup à l'avenir. –