Отрицательная одинарная кавычка в классе символов

У меня есть следующий код, где я пытаюсь заменить assign с always @(*) используя САС.

По сути, я пытаюсь игнорировать ' в классе персонажей, но SED все еще, кажется, соответствует этому. Я не хочу, чтобы sed поймал строку, если строка содержит ' (Мое регулярное выражение намного сложнее, чем это, но я хочу, чтобы sed перехватывал строки, которые мое регулярное выражение, и игнорировал строки, которые совпадают с моим регулярным выражением, но содержат ')

echo "assign sample_signal = '0;" | sed '/[^\x27]/ {s/assign/always @(*)/g}'

Результат: always @(*) sample_signal = '0;

3 ответа

Решение

Попробуйте это, пожалуйста (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;

Вы сделали две ошибки:
1. /[^\x27]/ означает соответствовать любому символу, который не является ', но есть много персонажей, которые не ', так что регулярное выражение будет соответствовать в любом случае.
2. Вы не использовали -n который должен подавить вывод, так что совпадать или нет, если он установлен или нет, строка будет напечатана в любом случае.

Итак, я изменился на /[\x27]/!{} что означает, когда \x27 соответствует, не выполнить блок {},
sed Слово, оно будет выполнено, когда не соответствует.)
И по -n переключатель и p в блоке, строки с ' игнорируются

Просто используйте '\'' везде, где вам нужно ':

$ echo "f'oo" | sed 's/'\''o/X/'
fXo

$ echo "f'oo" | sed 's/[^'\'']o/X/'
f'X

Вы можете заключить вашу команду sed в двойные кавычки и просто использовать /'/! применить вашу команду к строкам, не содержащим кавычек:

echo "assign sample_signal = '0;" | sed "/'/! {s/assign/always @(*)/g;}"

Если есть только один s Команда для применения, вы также можете опустить скобки:

echo "assign sample_signal = '0;" | sed "/'/! s/assign/always @(*)/g"

Как отмечает @EdMorton в комментариях, заключение команды в двойные кавычки может иметь нежелательные последствия. Возможно, вам придется уйти от знака доллара (\$), чтобы избежать нежелательного расширения переменных в вашем шаблоне) и двойной обратной косой черты: \\\,

Другие вопросы по тегам