2

Я должен преобразовать содержимое файла из \ в \\ в Windows в сценарии. Поэтому я получил Coreutils и попытался использовать tr \ \\ <file_in> file_out в Windows CMD, но \ in file_out остаетсяde \ вместо преобразования в \. Файл содержит LF (\ n) и CRLF (\ r \ n), но они должны остаться без изменений. Есть ли способ использовать tr для внесения изменений, которые я пытался сделать?

3 ответа3

0

tr имеет дело с отдельными символами, на самом деле он не имеет дело со строками, хотя есть совпадение.

Вы можете заменить несколько вхождений одного символа одним вхождением (Замена \\ на \), опцией, которую он называет «сжать», но вы захотите другой путь. Теоретически можно сказать, что он включает в себя как индивидуального персонажа столько же, тем не менее, tr не может этого сделать, у него нет возможности присвоить ему характер и указать, сколько раз он должен появиться. У этого есть опция сокращения символа, но не опция повторения символа.

Вы можете использовать Sed, вы можете найти, что вы должны использовать одинарные кавычки, а не двойные кавычки

 $ echo '\' | sed 's_\\_\\\\_g'
\\

или sed 's/a/b/g' filename

синтаксис sed с его командой s, это sed "s/find/replace/" а добавление модификатора g в конец гарантирует, что он не просто останавливается на первом, он заменяет каждое вхождение. sed 's/find/replace/g' Обычно люди используют / Вы можете использовать _ т.е. s_a_b_g Вы не ставите / после g.

Что касается \r\n и \n эта строка sed не повлияет на это. \r\n не сохраняется с фактическим обратным слешем, он хранится с двоичным кодом для кодов ascii, которые он представляет. 13 для \r и 10 для \n посмотрите на таблицу ascii, и вы увидите это.

0

Тр переводит только один символ. Чтобы заменить его более чем одним символом, необходимо использовать sed. Его можно найти в GnuWin32 - порте инструментов linux для Windows. Для замены \ на \\ вы должны использовать fe

  cat file | sed "s_\\_\\\\_g" 

S для отдельного режима, g обозначает глобальный - по умолчанию sed заменяет только первый вхождение в строке. \\\\ вместо \\ и \\\\\\\ of \\\\ потому что обратную косую черту необходимо экранировать, используя дополнительную обратную косую черту.

0

Как уже отмечалось, tr только преобразует один символ в другой.

Вы можете использовать мою утилиту обработки текста регулярных выражений JREPL.BAT, чтобы легко и эффективно решить вашу проблему. Это чистый скрипт (гибридный JScript/batch), который работает на любом компьютере с Windows начиная с XP.

jrepl "\" "\\" /l /f file.txt /o -

Выше будет писать каждую строку с \r \n терминаторами.

Если вам необходимо сохранить исходные ограничители строки, вы можете использовать параметр /M multi-line

jrepl "\" "\\" /l /m /f file.txt /o -

Команды выше используют литеральный ключ /L Без /L команда интерпретирует поисковый термин как регулярное выражение, поэтому вам потребуется:

jrepl "\\" "\\" /m /f file.txt /o -

Используйте call jrepl если вы используете команду в пакетном скрипте.

Интересно, что JREPL имеет опцию перевода /T которая работает очень похоже на команду unix tr . Но это не имеет никакого смысла в вашей ситуации.

Используйте jrepl /? посмотреть встроенную документацию. Передайте вывод на more если вы хотите ограничить вывод только одним экраном за раз. Мне не нужно more потому что мое окно консоли настроено с большим буфером вывода, так что я могу прокрутить вверх, чтобы увидеть предыдущий вывод.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .