Заменить строку в Bash с определенным условием - PullRequest
0 голосов
/ 10 января 2019

Если у меня есть строка:

path1=/path/me & you/file.json&path2=/path/you & me/file.txt

Я ожидаю, что результат будет таким:

path1=/path/me & you/file.json;path2=/path/you & me/file.txt

Мне нужно заменить &, чтобы его передняя и задняя части не содержали space, я пробовал с sed, но у меня есть это

path1=/path/me ; you/file.json;path2=/path/you ; me/file.txt

Ответы [ 3 ]

0 голосов
/ 10 января 2019
sed -r 's/(\S)&(\S)/\1;\2/g'

Где -r включить регулярное выражение и \ S - все, кроме пробелов.

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

Наверное, вы ищете

sed 's/&\([a-z][a-z0-9]*=\)/;\1/g'

т.е. замените только точки с запятой, за которыми сразу следует токен и знак равенства. (Возможно, вам придется изменить определение токена, в зависимости от того, как могут выглядеть ваши токены. Например, подчеркивание часто поддерживается, но используется редко. Возможно, вы также захотите поддерживать прописные буквы.)

Если это вообще возможно, исправьте процесс, который производит эти значения, поскольку формат по своей сути неоднозначен.

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

Вы можете использовать [^ ], чтобы сопоставить непробельный символ и убедиться, что он находится в \(capture group\), чтобы вы могли ссылаться на него в строке замены:

sed -e 's/\([^ ]\)&\([^ ]\)/\1;\2/'

Это находит любую трехсимвольную последовательность non-space & non-space и заменяет ее только двумя захваченными символами, эффективно заменяя любой & без пробела рядом с ним.

Это повлияет на foo&bar, но не foo & bar или foo& bar или &foo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...