Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/11/2019, à 21:39

L'Africain

(Résolu) Remplacement de parenthèse dans un fichiers

Bonjour,
J'ai plusieurs fichiers texte dans lesquels je souhaiterait remplacer des parenthèses comme ceci:

Ort, vor (d. h. östlich von) der Ebene. (H. Araba, wie Kap. 3,16; so auch Kap. 11,2. 16;12,1. 3. 8;18,18) Er wußte aber nicht, daß ihm im Rücken der Stadt ein Hinterhalt gelegt war.

Par:

Ort, vor \f + \ft d. h. östlich von\f* der Ebene. \f + \ft H. Araba, wie Kap. 3,16; so auch Kap. 11,2. 16;12,1. 3. 8;18,18\f Er wußte aber nicht, daß ihm im Rücken der Stadt ein Hinterhalt gelegt war.

Avec une contrainte, à savoir que dans un groupe de parenthèse il peut y avoir un autre groupe de parenthèse qui dans ce cas n'a pas à être remplacé, par exemple:

Mitte des Flußtales an, (Vergl. die Anm. zu 4. Mose 13,23; (desgl. Jos. 13,9. 16)) und

Deviendrait:

Mitte des Flußtales an, \f + \ft Vergl. die Anm. zu 4. Mose 13,23; (desgl. Jos. 13,9. 16)\f* und

J'ai essayé ça:

sed -ri 's/ \((*.*)\)/\\f \+ \\ft \1\\f*/g'' *txt

Mais j'ai cette erreur:

sed: -e expression n°1, caractère 33: Expression régulière précédente invalide

Mais même si ça fonctionnerait je crois que ça produirait des erreurs car il utiliserait la première parenthèse de fermeture, je le signale quand même car je voudrais comprendre à quoi est due l'erreur.

Merci d'avance

Dernière modification par L'Africain (Le 12/11/2019, à 14:40)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 10/11/2019, à 22:09

pingouinux

Re : (Résolu) Remplacement de parenthèse dans un fichiers

Bonsoir,

L'Africain #1 a écrit :

J'ai essayé ça:

sed -ri 's/ \((*.*)\)/\\f \+ \\ft \1\\f*/g'' *txt

sed -ri 's/ \((*.*)\)/\\f \+ \\ft \1\\f*/g'' *txt
Tu as en trop : * et '

Pour le premier exemple, ceci devrait marcher.

sed -ri 's/ \(([^)]*)\)/\\f \+ \\ft \1\\f*/g' *txt

Pour le second, pas d'idée pour l'instant.

Hors ligne

#3 Le 11/11/2019, à 20:15

L'Africain

Re : (Résolu) Remplacement de parenthèse dans un fichiers

Ok merci, je vais faire le reste manuellement.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#4 Le 12/11/2019, à 02:33

kamaris

Re : (Résolu) Remplacement de parenthèse dans un fichiers

Normalement, ce petit programme awk devrait faire l'affaire (testé sur tes deux lignes + deux trois autres, sans trop d'approfondissement… de même, le test d'erreur devrait être plus complet)

#!/bin/bash

awk -F'(' '{
if ( NF!=split($0,a,")") ) {
  print "Erreur : le nombre de parenthèses ouvrantes est différent du nombre de parenthèses fermantes."
  exit 1
}
s=$1; n=0; m=0
for (i=2;i<=NF;i++) {
  n++; m=split($i,a,")")-1
  if (n==1) s=s "\\f + \\ft "
  else s=s "("
  if (m>0) {
    if (m==n) {
      for (j=1;j<=m-1;j++) s=s a[j] ")"
      s=s a[m] "\\f*" a[m+1]
      n=0
    } else { s=s $i; n-=m }
  } else s=s $i
}
print s }' "$1"

Dernière modification par kamaris (Le 12/11/2019, à 13:48)

Hors ligne

#5 Le 12/11/2019, à 03:02

L'Africain

Re : (Résolu) Remplacement de parenthèse dans un fichiers

Merci Kamaris ça a l'air de fonctionner correctement, un "leger" problème, c'est que quand il y a u problème de parenthèse, le texte est remplacé par "Erreur : le nombre de paranthèses ouvrantes est différent du nombre de paranthèses fermantes." Ce qui me donne des fichiers amputé en sortie.
J'ai utilisé cette boucle, dans laquelle le script notes.sh est le contenu de ton post:

for i in *.usfm ; do ./notes.sh $i >$i_note ; done

Cependant l'idée d'y mettre une alerte est bonne.

Dernière modification par L'Africain (Le 12/11/2019, à 03:11)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#6 Le 12/11/2019, à 13:47

kamaris

Re : (Résolu) Remplacement de parenthèse dans un fichiers

J'ai modifié le programme awk pour que s'il détecte un problème de parenthèses sur une ligne, il écrive son message d'erreur sur la sortie d'erreur standard du shell appelant, et qu'il écrive la ligne en sortie standard sans modification (au lieu de quitter).
Ça devrait aller pour ta boucle, tu auras les erreurs dans le terminal et tes fichiers de sortie seront complets et non pollués.
J'ai aussi modifié le script pour qu'il puisse prendre en une fois un nombre arbitraire de fichiers d'entrée (passés directement à awk).

#!/bin/bash

awk -F'(' '{
if ( NF!=split($0,a,")") ) {
  print "Erreur (fichier " FILENAME ", ligne " FNR ") : le nombre de parenthèses ouvrantes est différent du nombre de parenthèses fermantes." > "/dev/stderr"
  print
  next
}
s=$1; n=0; m=0
for (i=2;i<=NF;i++) {
  n++; m=split($i,a,")")-1
  if (n==1) s=s "\\f + \\ft "
  else s=s "("
  if (m>0) {
    if (m==n) {
      for (j=1;j<=m-1;j++) s=s a[j] ")"
      s=s a[m] "\\f*" a[m+1]
      n=0
    } else { s=s $i; n-=m }
  } else s=s $i
}
print s }' "$@"

Hors ligne

#7 Le 12/11/2019, à 14:40

L'Africain

Re : (Résolu) Remplacement de parenthèse dans un fichiers

Ok merci c'est parfait!


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne