Отрицательная одинарная кавычка в классе символов - PullRequest
0 голосов
/ 20 января 2019

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 20 января 2019

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

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

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

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

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

0 голосов
/ 21 января 2019

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

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

$ echo "f'oo" | sed 's/[^'\'']o/X/'
f'X
0 голосов
/ 20 января 2019

Попробуйте, пожалуйста (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, который должен подавлять вывод, так что совпадать или нет, s убирать или нет, строка все равно будет напечатана.

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

...