J'ai le code suivant où j'essaye de remplacer assign par always @ (*) en utilisant SED.
Essentiellement, j'essaie d'ignorer le ' dans la classe de caractères mais SED semble toujours y correspondre. Je ne veux pas que sed attrape la ligne si la ligne contient un ' (Mon regex est beaucoup plus compliqué que cela mais je veux que sed attrape les lignes de mon regex et ignore les lignes qui correspondent à mon regex mais contiennent un ')
echo "assign sample_signal = '0;" | sed '/[^\x27]/ {s/assign/always @(*)/g}'
Résultat: always @ (*) sample_signal =' 0;
3 Réponses :
Essayez ceci s'il vous plaît (GNU sed):
$ echo "assign sample_signal = '0;" | sed -n '/[\x27]/!{s/assign/always @(*)/g; p}'
$ echo "assign sample_signal = 0;" | sed -n '/[\x27]/!{s/assign/always @(*)/g; p}'
always @(*) sample_signal = 0;
Deux erreurs que vous avez faites: J'ai donc changé en
1. / [^ \ x27] / signifie faire correspondre tout caractère qui n'est pas un ', mais il y a beaucoup de caractères qui ne sont pas ' code >, donc l'expression régulière correspondra de toute façon.
2. Vous n'avez pas utilisé -n qui est de supprimer la sortie, donc match ou non, s ubstitude ou pas, la ligne sera imprimée de toute façon. p> / [\ x27] /! {} ce qui signifie que lorsque \ x27 correspondait, pas d'exécuter le bloc {} code>.
(Dans le mot de sed , il sera exécuté s'il ne correspond pas .)
Et par le commutateur -n et p dans le bloc, les lignes avec ' sont ignorées.
Vous pouvez mettre votre commande sed entre guillemets et utiliser simplement / '/! pour appliquer votre commande aux lignes ne contenant pas de guillemets:
echo "assign sample_signal = '0;" | sed "/'/! s/assign/always @(*)/g"
S'il y en a une seule commande s à appliquer, vous pouvez également omettre les accolades:
echo "assign sample_signal = '0;" | sed "/'/! {s/assign/always @(*)/g;}"
Comme @EdMorton le souligne dans les commentaires, en mettant la commande entre guillemets peut avoir des effets indésirables. Vous devrez peut-être échapper le signe dollar ( \ $ ) pour éviter une expansion de variable indésirable dans votre modèle) et des doubles barres obliques inverses d'échappement: \\\ .
p >
Utilisez simplement '\' ' partout où vous avez besoin d'un ':
$ echo "f'oo" | sed 's/'\''o/X/' fXo $ echo "f'oo" | sed 's/[^'\'']o/X/' f'X