Я должен преобразовать содержимое файла из \ в \\ в Windows в сценарии. Поэтому я получил Coreutils и попытался использовать tr \ \\ <file_in> file_out в Windows CMD, но \ in file_out остаетсяde \ вместо преобразования в \. Файл содержит LF (\ n) и CRLF (\ r \ n), но они должны остаться без изменений. Есть ли способ использовать tr для внесения изменений, которые я пытался сделать?
3 ответа
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, и вы увидите это.
Тр переводит только один символ. Чтобы заменить его более чем одним символом, необходимо использовать sed. Его можно найти в GnuWin32 - порте инструментов linux для Windows. Для замены \
на \\
вы должны использовать fe
cat file | sed "s_\\_\\\\_g"
S для отдельного режима, g обозначает глобальный - по умолчанию sed заменяет только первый вхождение в строке. \\\\
вместо \\
и \\\\\\\
of \\\\
потому что обратную косую черту необходимо экранировать, используя дополнительную обратную косую черту.
Как уже отмечалось, 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
потому что мое окно консоли настроено с большим буфером вывода, так что я могу прокрутить вверх, чтобы увидеть предыдущий вывод.