используя tr из coreutils для windows

1418
R. Nec

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

1

3 ответа на вопрос

0
barlop

tr deals with individual characters, it doesn't really deal with strings, though there is overlap.

you can replace multiple occurrences of a single character, with one occurrence( Replacing \\ with \), an option it calls 'shrink' but you'd want the other way. In theory one could say that involves an individual character just as much, nevertheless, tr cannot do that, it has no option to give it a character and state how many times it should appear. It has that shrink character option but not a repeat character option.

You can use sed, you may find you have to use single quotes rather than double quotes

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

or sed 's/a/b/g' filename

syntax with sed with its s command, is sed "s/find/replace/" and putting a g modifier on the end will make sure it doesn't just stop at the first one, it replaces every occurrence. sed 's/find/replace/g' Normally people use / You can use _ i.e. s_a_b_g You don't put a / after the g.

As for \r\n and \n that sed line won't affect it. \r\n is not stored with an actual backslash, it's stored with the binary for the ascii codes it represents. 13 for \r and 10 for \n look at an ascii table and you'd see that.

0
R. Nec

Tr translates only single character. To replace it with more than one char it is needed to use sed. It can be found in GnuWin32 - port of linux tools for Windows. To replace \ with \\ you should use f.e.

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

The s is for separate mode, g stands for global - in default sed replaces only first occurence in row. \\\\ instead of \\ and \\\\\\\ of \\\\ because backslash has to be escaped using additional backslash.

Пробовал в sed gnu версии 4.2.2 в Cygwin, и не удается. `$ cat ff | sed "s _ \\ _ \\\\ _ g" `` sed: -e выражение # 1, char 8: неопределенная `s 'команда` Но работает с одинарными кавычками. barlop 9 лет назад 0
0
dbenham

Как уже отмечали другие, 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потому что мое окно консоли настроено с большим буфером вывода, так что я могу прокрутить вверх, чтобы увидеть предыдущий вывод.

Похожие вопросы