3
votes

Annuler une citation unique dans la classe de caractères

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;


0 commentaires

3 Réponses :


2
votes

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:
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>

J'ai donc changé en / [\ 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.


0 commentaires

1
votes

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 >


0 commentaires

2
votes

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


0 commentaires