Отрицательная одинарная кавычка в классе символов
У меня есть следующий код, где я пытаюсь заменить 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 в комментариях, заключение команды в двойные кавычки может иметь нежелательные последствия. Возможно, вам придется уйти от знака доллара (\$
), чтобы избежать нежелательного расширения переменных в вашем шаблоне) и двойной обратной косой черты: \\\
,