2017-10-11 2 views
0

Il s'agit probablement d'un problème de syntaxe de script Sed et shell, ainsi que de Regex. (Edit: peut-être un problème d'E/S, comme regex a travaillé lors de la lecture du fichier dans le shell bash, mais le fichier .txt réel n'a pas été modifié comme on le souhaite)Sed Regex OSX trouver des chiffres romains et remplacer par une chaîne vide. Erreur "modèle de remplacement non terminé"

Essayer de préparer un dossier .txt pour un traitement du langage naturel travail. Je voulais supprimer quelques chiffres romains dans un fichier texte contenant les sonnets de Shakespeare, chaque sonnet commençant par un chiffre romain tel que IX. et XVIII. qui représente le titre du sonnet individuel, y compris le caractère décimal.

Exemple intput texte:

XXV.

Let those who are in favour with their stars

Of public honour and proud titles boast,

sortie souhaitée:

Let those who are in favour with their stars

Of public honour and proud titles boast,

Suivant l'exemple en this question, j'ai essayé toutes les commandes suivantes dans le shell bash Terminal:

$ sed -i 's/[IVXLC]{1,}[.]//g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/^$/g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/()/g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/[]/g' sonnets.txt

L'idée était de remplacer un match avec une chaîne vide. Depuis cela ne fonctionne pas, j'ai essayé de remplacer correspondre avec un espace:

$ sed -i 's/[IVXLC]{1,}[.]/^ $/g' sonnets.txt

Pas de chance. Toutes les commandes ci-dessus sont revenus la même erreur:

sed: 1: "sonnets.txt": unterminated substitute pattern

Je l'ai testé l'expression régulière dans le champ « trouver » sur https://regexr.com/ et il semblait être correct. Le fichier cible était dans le répertoire de travail. Une idée de ce qui a mal tourné? Quels caractères dois-je utiliser dans le champ "remplacer" de la commande Sed? Dois-je modifier la regex et/ou la commande Sed?

+0

Pouvez-vous coller un exemple de texte? Quelle est l'entrée et comment voulez-vous que la sortie ressemble. ? –

+0

Je pense que les '{' et '}' doivent être échappés. '\ {' et '\}'. Les crochets peuvent également avoir besoin d'être échappés. –

+0

'{} []' ne semble pas être un problème lors du test sur https://regexr.com/ – Elan

Répondre

1

Comme mentionné dans Leffler @ Jonathan commentaires, mon Mac utilise BSD sed et c'est la raison pour laquelle la commande ne fonctionne pas.

J'installé GNU sed par Homebrew:

brew install gnu-sed

ensuite utilisé la commande:

gsed -i 's/[IVXLC]\{1,\}[.]//g' sonnets.txt

frappe dans gsed invoque la GNU sed, et cela a fonctionné comme souhaité. Il a modifié le contenu du fichier .txt en place.

Dans cette configuration, comme mentionné @Hakan Baba, le regex avait vraiment besoin d'échapper aux accolades:

\{\}

+0

Vous pouvez effectivement faire sans la gamme/quantificateur limitant ici, voir ma réponse. –

1

Les accolades doivent être échappées.

$ sed 's/[IVXLC]\{1,\}[.]//g' sonnets.txt 


Let those who are in favour with their stars 

Of public honour and proud titles boast, 
0

Le problème semble être avec la plage (ou limitant) quantificateurs {m,n} cela n'est pas pris en charge dans votre version BSD sed. Notez que vous pouvez réécrire l'{1,} quantificateurs à l'aide [IVXLC][IVXLC]* (un romain « chiffre » suivi avec 0+ chiffres romains):

sed -i 's/[IVXLC][IVXLC]*[.]//g' sonnets.txt 
      ^^^^^^^^^^^^^^^ 

Aussi, si vous devez vous assurer que vous ne les faire correspondre des chiffres romains au début de la ligne, ajoutez ^ au début du modèle (ce qui signifie que vous pouvez également omettre le modificateur g à la fin de l'expression régulière). Pour les apparier en mots entiers, ajoutez [[:<:]] limite de mot au début du motif.

+0

Idée intéressante avec '[IVXLC] [IVXLC] *'! Pour ce document particulier avec lequel je travaillais, il contient plus de 100 chiffres romains dénotant tous les sonnets écrits par Shakespeare. Les caractères '^' et '$', qui marquent le début et la fin de la saisie de texte entière, ne s'appliqueraient probablement pas. – Elan

+0

Cependant, la limite initiale du mot [[: <:]] 'pourrait être intéressante. –