Как избежать любого backsla sh внутри файла, используя sed - PullRequest
0 голосов
/ 31 марта 2020

Привет, у меня есть файл, в котором есть строка в формате массива, и я использую от jq до l oop через каждый индекс, и у меня есть логика c, зависящая от строки в каждом индексе. Однако есть символ обратного хода sh, и jq возвращает недопустимый escape-символ. Так что я думаю, что мне нужно убежать от backla sh. Как я могу сделать это с помощью sed?

Пример:

["*","*Cases","*/opt/selenium/tests/src/test/cases","*../../src/test/cases","*01 Login","*/opt/selenium/tests/src/test/cases/01_login.robot","*../../src/test/cases/01_login.robot","*TC001 Verify the login","*<p>If member has clicked 'Remember Me' check box, after the deployment, it's not necessary to input account and password when login. Web do not have the 'Remember Me' function\x3c/p>","*Login button is not visible after 60 seconds"]

Ответы [ 3 ]

0 голосов
/ 31 марта 2020

Вы написали, что хотите убежать от любого назад sla sh (\), а не sla sh (/). Если предположить, что escape-символ сам по себе является backsla sh, то следующее должно выполнить эту работу:

sed -i 's/\\/\\\\/g' filename

Это может стать еще короче:

sed -i 's/\\/&&/g' filename

, но с использованием литералов в замене вместо переменной & более эффективен.

В случае, если вы только что сделали некую опечатку и хотите вместо нее убрать косую черту с обратной косой чертой, тогда будет достаточно следующей команды:

sed -i 's|/|\\/|g' filename

(Поскольку я использовал | вместо /, мне не нужно экранировать / в замене.)

0 голосов
/ 01 апреля 2020

Ошибка, вероятно, вызвана escape-последовательностью \x3c, появляющейся в одном из строковых литералов. Это допустимая escape-последовательность в JavaScript (она представляет символ <), но в JSON она недопустима. JSON поддерживает экранирование Unicode, хотя: \u003c.

Очевидно, вы получили свой ввод от какого-то сериализатора JavaScript. Конечно, лучшим решением было бы заменить его на правильный JSON сериализатор. Если это невозможно или нецелесообразно (например, потому что это исходит от третьей стороны), тогда вы можете использовать sed для замены каждого \xnn его аналогом Unicode \u00nn.

sed 's/\\x\([0-9A-Fa-f]\{2\}\)/\\u00\1/g' poorjson.txt

Выход:

["*","*Cases","*/opt/selenium/tests/src/test/cases","*../../src/test/cases","*01 Login","*/opt/selenium/tests/src/test/cases/01_login.robot","*../../src/test/cases/01_login.robot","*TC001 Verify the login","*<p>If member has clicked 'Remember Me' check box, after the deployment, it's not necessary to input account and password when login. Web do not have the 'Remember Me' function\u003c/p>","*Login button is not visible after 60 seconds"]

Обратите внимание, что это не на 100% надежно. Он не проверяет, не экранирован ли сам backsla sh.

0 голосов
/ 31 марта 2020

Вы можете сбежать / с \/ в sed следующим образом:

sed -i "s#\/#\\\/#g" filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...