Intereting Posts
сохраняющиеся многофакторные пользовательские данные для пользовательской проверки подлинности pam в CentOS 7 Файловые дескрипторы и перенаправление в bash Разрешения Samba не применяются Записывать вывод программы в файл журнала, содержащий PID в его имени KDE – проблема с темными темами Изящное завершение работы с возможностью сохранения файлов или отмены сложность «cd» на ext4 Как я могу искать файлы без определенных расширений в своих именах? Как автоматически добавить новый путь к переменной $ PATH после установки пакета RPM? изменение домашнего каталога пользователя не влияет Учитывая права, владельца и группу файла, какой алгоритм определяет, может ли данный пользователь читать / записывать / выполнять файл? Git Server: игнорировать пробельные изменения в новых коммитах Запустите команду, не заставляя меня ждать Обработка текста: замена строк в строке соответствующими строками Lenovo Thinkpad T440s Fedora 20 Проблема аутентификации WiFi

Пути трубопроводов с различными типами котировок для замены косой черты

Я хотел бы использовать sed для преобразования пути с обратными косыми чертами в один и тот же путь с помощью косой черты:

Например, я хотел бы передать \\path\to\file\ и получить /path/to/file

Ни одна из следующих команд не работает, и я не могу сказать, почему:

Первая попытка:

 > echo '\\path\to\file\' | sed 's/\\/\//g' /path o ile/ 

Вторая попытка:

 echo \\path\to\file\ | sed 's/\\/\//g' /pathtofile 

Третья попытка:

  echo "\\path\to\file\" | sed 's/\\/\//g' dbquote> 

Я получаю подобное поведение, если попытаюсь подключиться к | tr '\' '/' | tr '\' '/'

Я ищу правильный ответ и, если возможно, объясню, почему ни одна из попыток выше не работала. Не уверен, если это имеет значение, но все это на zsh 4.2.6 (x86_64-redhat-linux-gnu)

Благодаря!

 file='\\path\to\file\' printf '%s\n' "$file" | tr -s '\\' / 

ЗШ:

 setopt extendedglob print -r -- ${file//\\##/\/} 

Не используйте echo . Проблема с echo заключается в том, что существует слишком много версий, и каждый обрабатывает обратную косую черту несколько иначе. Ваш, очевидно, интерпретирует обратную косую черту в исходной строке. Если вы только что

 # first attempt echo '\\path\to\file\' 

Я подозреваю, что вы увидите

 \path o ile\ 

Точно так же во всех ваших других попытках проблема заключается в использовании echo и взаимодействиях между echo сигнатурой и обратным слэшем оболочки, а не со второй частью канала ( sed или tr ).

Решение состоит в том, чтобы использовать printf вместо этого – его поведение намного более последовательное и портативное, поскольку оно задано POSIX .

 printf '\\\\path\\to\\file\\\n' 

получает вас

 \\path\to\file\ 

Вы можете просто использовать POSIX heredoc для этого:

 % sed -e 's@\\@/@g' -e 's@\(.\):\(.*\)@/drive/\1\2@' <<'_EOF_' > c:\some\stupid\windows\place > _EOF_ /drive/c/some/stupid/windows/place 

Мой ответ. Есть ли способ получить фактические неинтерпретируемые аргументы оболочки в функции, это более подробно описывает это, включая динамическое read его в переменную оболочки с помощью подстановки команд, если необходимо, и передать ее как аргумент функции оболочки.

В моем ответе на Quoting в строках типа ssh $ host $ FOO и ssh $ «sudo su user -c $ FOO» я предлагаю, возможно, другое и, как я считаю, более прямолинейное средство решения проблемы, которая была в противном случае превосходно ответил.

EDIT: Извините, но я изначально не заметил вашего запроса « объяснения, почему ни одна из [ваших] попыток [при цитировании обратных косых черт, как показано в вашем вопросе] выше, работала:

Трюк к пониманию ответа, хотя и не совсем таинственный по своему усмотрению, просто, к сожалению, довольно неинтуитивный. Основной барьер, который мы обычно встречаем в этих строках, или, по крайней мере, что я делаю, заключается в том, что shell является нашим стандартным интерфейсом к компьютеру. Как таковой, я думаю, иногда бывает трудно вспомнить, что это всего лишь программа; это просто приложение, как и любое другое.

Это может быть немного легче увидеть через него, если вы немного измените названия вещей; не называйте его « shell », но попробуйте называть его вместо « command interpreter » (хотя shell , вероятно, тоже будет прекрасна, если слово имеет тенденцию унаследовать меньшую конкретизацию jargonal, а его базовое значение стало немного лучше) .

Я считаю, что более корректно приписывать меньше контроля над shell чем я мог бы сделать, когда это становится, а не просто моим interpreter . Мне также легче запомнить, что, когда он участвует, он не интерпретирует только меня, но также, верный своей цели и по самой своей природе, пытается посредником любой разговор, к которому он относится; если предоставляется такая возможность, shell интерпретирует данные других приложений, переданные друг другу, нужно ли это или нет.

То, что я вожу, состоит в том, что command interpreter естественно, интерпретирует по умолчанию всю информацию, переданную ему на свой родной язык, но его язык не обязательно более корректен в своем собственном праве, чем любой другой язык приложения. Разумеется, полезно, чтобы другие приложения хорошо говорили на языке command interpreter , что избавило их от необходимости интерпретировать вас самих, но у них есть такое же право попробовать, как и все, что они делают, просто компьютерные программы в конце.

Усложняя вопросы для своих сестринских приложений, нет единого правильного или неправильного способа интерпретации команд. Самое близкое к правилу, в котором касается Unix (и, следовательно, возможно, вообще) , вероятно, является стандартом POSIX, но он, безусловно, оставляет некоторое пространство для интерпретации интерпретации (это было весело сказать, и, как я надеюсь, должно, вероятно, проиллюстрировать мою точку зрения ) . Результат – своего рода аналоговый цифровой язык для многих диалектов человеческого аналогового языка (также забавный) .

(Большинство из приведенных выше – просто учебник, и, вероятно, по крайней мере, немного не нужно полностью понимать следующее, но я надеюсь, что это поможет.)

Когда мы передаем команду shell она перебирает список правил, которые запрограммированы в определенном порядке, чтобы интерпретировать нашу команду, прежде чем передавать ее интерпретацию нашей команды, как она интерпретировала, которую мы намерены делать. Нашим основным способом влияния на правила и в каком порядке он их считает (кроме, конечно, самой команды), являются разные типы shell quotes , среди которых обычно включается, как вы нашли, символ \ backslash.

Другие приложения имеют почти столько же причин и имеют такое же право применять свои собственные наборы правил интерпретации, но вряд ли будут иметь шанс до первого shell , и, как правило, их правила будут смоделированы после команд shell . Это может усложниться, когда они принимают ту же самую механику цитирования, что и shell , потому что она оставляет на нас бремя (хе-хе), чтобы \'"quote our quotes"\' . Это осложнение может быть разочаровываемо, когда shell и наше целевое приложение сильно отличаются от синтаксиса цитаты, и мы должны косвенно обращаться друг к другу через тонко утомительную инструкцию, чтобы в переводе ничего не терялось.

Мои предпочтительные способы обращения с такими ситуациями, как я продемонстрировал в своем блоке кода выше, – это просто непосредственно проинструктировать shell где она должна быть, так сказать, и что она должна просто игнорировать все, начиная от <<'HERE' потому что Я думаю, что я могу справиться с этим разговором один, очень спасибо, и я обязательно узнаю об этом \nHERE\n когда он снова начнет обращать внимание.

В bash первая попытка работает как шарм. Это зависит от того, что такое echo и какая версия вы используете. Например, echo является встроенным bash и переопределяет /bin/echo или /usr/bin/echo . Проверьте man bash и info zsh чтобы сравнить, какие параметры они принимают и каковы значения по умолчанию.

То, что вы на самом деле хотите, это заставить echo -E отключить интерпретацию escape-последовательности. Это значение по умолчанию для bash но, по-видимому, не в zsh . Вы также можете отключить этот конкретный встроенный (я не использую zsh поэтому я не знаю, как), или используйте наиболее распространенный способ обращения с этим: вызывать echo явно как /bin/echo .

Редактирование: конечно, вам нужны одинарные кавычки, иначе оболочка будет интерпретировать escape-последовательности, прежде чем echo даже даст шанс.