використовуючи tr з coreutils для Windows


2

Я повинен перетворити вміст файлу з \ в \\ у Windows в скрипт. Тому я отримав Coreutils і спробував використовувати tr \ \\ <file_in> file_out у Windows CMD, але \ in file_out оставаde \ замість того, щоб перетворити на \. Файл містить LFs (\ n) та CRLFs (\ r \ n), але вони повинні залишатися незмінними. Чи існує спосіб використання tr для виконання змін, які я намагався зробити?

Відповіді:


0

Як зазначали інші, trлише перетворює одного символу в іншого єдиного символу.

Ви можете використовувати мою утиліту для обробки тексту регулярних виразів JREPL.BAT, щоб легко та ефективно вирішити свою проблему. Це чистий скрипт (гібридний JScript / пакетний), який працює на будь-якій машині Windows від XP і далі.

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

Вище буде записано кожен рядок із \ r \ n термінаторами.

Якщо потрібно зберегти оригінальні термінатори ліній, тоді можна скористатися /Mбагаторядковою опцією

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

Команди вище використовують /Lперемикач прямолінійної форми. Без /Lцього команда інтерпретує пошуковий термін як регулярний вираз, тому вам знадобиться:

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

Використовуйте, call jreplякщо ви використовуєте команду в пакетному сценарії.

Цікаво, що JREPL має /Tваріант перекладу, який функціонує дуже аналогічно trкоманді unix . Але це не приносить користі вашій ситуації.

Використовуйте jrepl /?для перегляду вбудованої документації. Виконайте висновок, moreякщо потрібно обмежити вихід одним екраном. Мені це не потрібно, moreоскільки моє вікно консолі налаштоване великим вихідним буфером, щоб я міг прокрутити вгору, щоб побачити попередній вихід.


0

Tr перекладає лише один символ. Щоб замінити його більш ніж одним знаком, потрібно використовувати sed. Його можна знайти в GnuWin32 - порту інструментів Linux для Windows. Для заміни \з \\слід використовувати Fe

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

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


Спробували в sed gnu версії 4.2.2 в межах cygwin, і не вдалося. $ cat ff | sed "s_\\_\\\\_g" sed: -e expression #1, char 8: unterminated s 'команда', але працює з одинарними цитатами.
барлоп

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 ви не ставите a / після g.

Щодо того, \r\nі \n ця лінія sed не вплине на неї. \r\nне зберігається з фактичною зворотною косою рисою, вона зберігається з двійковим кодом ASCII, який вона представляє. 13 для \rі 10 для \n перегляду таблиці ascii, і ви це побачили.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.