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