'+' (une ou plusieurs occurrences) ne fonctionne pas avec "sed' de la commande
J'essaie d'affiner mon code par se débarrasser de l'inutile, des espaces blancs, des lignes vides, et d'avoir des parenthèses équilibré avec un espace entre eux, donc:
int a = 4;
if ((a==4) || (b==5))
a++ ;
devrait changer:
int a = 4;
if ( (a==4) || (b==5) )
a++ ;
Il fonctionne pour les crochets et les lignes vides. Cependant, il oublie de réduire les multiples espaces d'un espace:
int a = 4;
if ( (a==4) || (b==5) )
a++ ;
Voici mon script:
#!/bin/bash
# Script to refine code
#
filename=read.txt
sed 's/((/( (/g' $filename > new.txt
mv new.txt $filename
sed 's/))/) )/g' $filename > new.txt
mv new.txt $filename
sed 's/+//g' $filename > new.txt
mv new.txt $filename
sed '/^$/d' $filename > new.txt
mv new.txt $filename
Aussi, est-il un moyen de rendre ce script plus concis, par exemple, la suppression ou la réduction du nombre de commandes?
- Par ailleurs, en BRE vous pouvez utiliser
\{1,\}
au lieu de+
- Je ne comprends pas, est-ce que cela donner u de plusieurs espaces?
/ \{1,\}/
signifie "un ou plusieurs espaces", oui.- votre réponse est grande. J'ai édité accepté de répondre à comprendre votre commentaire!
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez GNU sed alors vous devez utiliser
sed -r
qui forcessed
d'utiliser les expressions régulières étendues, y compris le voulait comportement de+
. Voirman sed
:La situation est la même si vous utilisez OS X sed, mais alors vous devez utiliser
sed -E
:-r
fonctionne pourGNU sed
, maisOS X sed
en effet, les besoins-E
utilisation de l'étendue (moderne) des expressions régulières. Les deux font une distinction entre base et moderne expressions régulières et+
est interprété comme un caractère ordinaire dans le base fonctionnement desed
. Voir référence: Obsolètes ("base") expressions régulières diffèrent à plusieurs égards ( ... ) " + "et"? " sont des caractères ordinaires (...).gnu-sed
) et l'utilisation de lagsed
de commande pour émuler le comportement normal. (Je fais ça pour éviter d'avoir à apprendre les différents comportements de UNIX/BSD sed)\+
ci-dessous parce que-r/-E
arguments viennent avec beaucoup de côté les conséquences. La commutation d'une expression régulière étendue de fixer le+
problème, mais il est souvent briser d'autres parties de l'expression d'origine. Que dire de la parenthèse dans l'exemple de code? N'ont-ils pas échappé maintenant, quand-r/-E
est-il utilisé? Je pense que le()
vs\(\)
sens commutateurs avec une expression régulière étendue sur on/off.Vous devez précéder
+
avec un\
, sinonsed
essaie de faire correspondre le caractère+
lui-même.Pour rendre le script plus "intelligents", vous pouvez accumuler toutes les expressions dans un sed:
Certaines implémentations de
sed
même à soutenir le-i
option qui permet de modifier le fichier en place.sed -e 's///;s///;...'
sed
prend en charge plusieurs-e
options. Utiliser des points-virgules ou des retours à la ligne entre les commandes de script, et de les mettre tous dans une seule chaîne de caractères entre guillemets. Aussi sur MacOS le-i
option a besoin d'un argument; vous pouvez passer une chaîne vide si vous ne voulez pas d'une sauvegarde. Doncsed -i '' -E 's///;s///;...' "$filename"
-r/-E
juste pour éviter un `, a suggéré ci-dessus, c'est comme aller tuer un moustique avec un bazooka. En outre, plus de problèmes pourraient être facilement introduit que résolu.Parfois, -r et-e ne fonctionne pas.
Je suis à l'aide de sed version 4.2.1 et ils ne travaillent pas pour moi du tout.
Un rapide hack est d'utiliser l'opérateur * à la place.
Donc, disons que nous voulons remplacer tout l'espace redondant personnages avec un seul espace:
Nous aimerions faire:
Mais nous pouvons l'utiliser à la place:
(notez le double espace)
Peut-être pas la solution la plus propre. Mais si vous voulez éviter de
-E
et-r
pour rester compatible avec les deux versions de la sed, vous pouvez faire une répétition de caractèrecc*
- c'est 1c
alors 0 ou plusc
's==
1 ou plusc
's.Ou simplement utiliser la BRE de syntaxe, comme suggéré par @cdarke, pour correspondre à un nombre spécifique ou de modèles
c\{1,\}
. Le deuxième chiffre après la virgule est exclu à dire 1 ou plus.Cela pourrait fonctionner pour vous:
sur le bash avant;
J'ai d'abord fait un script test.sh
chat test.sh
puis nous faisons un fichier de données et un fichier de test aaa.txt
ensuite de tester et de voir les résultats.