Пытаюсь сделать простую замену sed, но я запутался в том, что нужно экранировать - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть эта строка: '$'nwnwnwnnn

И хотите изменить его на: { bitset<9>(0bnwnwnwnnn), '$'},

Я посмотрел на много похожих вопросов для разных оболочек, используя их методы, но ничего не помогло. Я обычно использую zsh, но могу использовать bash или другую оболочку.

Общая форма, которую я пробовал, такова:

sed -E -i new s/(\'.\')([nw]+)/{ bitset<9>(0b\2), \1},/g thing.txt

Он должен работать для любого символа, кроме $ и любой последовательности n или w.

Я обычно не понимаю, что мне нужно здесь убежать. В некоторых ответах на этом сайте сказано, что в первой части подстановки следует избегать скобок.

Я неправильно использую -i?

1 Ответ

0 голосов
/ 15 ноября 2018

Вам нужно избежать скобок, чтобы создать группу захвата, если вы используете базовое регулярное выражение, вы не избегаете их, если используете расширенное регулярное выражение.Параметр -E для GNU sed и параметр -r для стандартного sed включают расширенное регулярное выражение, поэтому вам не нужно их экранировать.

Если вы хотите только сопоставить $ вместо того, чтобы использовать любой символ в кавычках, вам нужно экранировать $.

Вам нужно поместить всю команду s/// в кавычки, так как это должен быть один аргумент sedкоманда.

При использовании -i принято ставить . перед суффиксом.Кроме того, суффикс добавляется к сохраненной копии исходного файла, а не к новому файлу, который вы создаете с изменениями, поэтому new является плохим суффиксом.

sed -E -i .bak "s/('\$')([nw]+)/{ bitset<9>(0b\2), \1},/g" thing.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...