2016-12-08 4 views
3

Несмотря на все sed-backslash обсуждения Stackoverflow Я не могу найти рабочего решения для моей конкретной проблемы. Я хочу, чтобы перед определенной строкой в ​​файле была обратная косая черта: something -> \something.sed: как заменить ст. по обратной косой чертой с последующим ссылкой

sed -i -- 's/\(something\)/\\\1/g' file 

Это всегда возвращает строку \1 вместо \something, потому что по какой-то причине СЕПГ считает, что должен бежать третий обратный слэш. (С моей точки зрения, более логичное) поведение может быть достигнуто путем вставки пробела между \\ и \1 в команде sed, но тогда результат будет \ something (т. Е. С вставленным пространством в результате), что не то, что я хочу.

Я запускаю эту команду в пакетном файле в Windows, используя sed от cygwin (надеюсь, это не имеет значения, поскольку я нацелен на кросс-платформенное решение).

EDIT:/usr/bin/sed версия 4.2.2.

+0

'эхо asdfsomethingasdf | sed 's/\ (something \)/\\\ 1/g'' отлично работает для меня – fancyPants

+0

Я не вижу никаких проблем, ваш образец работает для меня, протестирован с cygwin, а также Ubuntu 16.04. Проверьте команду sed командой 'which sed' и' sed --version'. Ваша проблема встречается только с обычными цитатами 'echo asdfsomethingasdf | sed - "s/\ (something \)/\\\ 1/g" ' – jeb

+0

Используемые теги неоднозначны. Пакетный файл - это dos/windows. В случае, если это изменение среды, одинарные кавычки к двойным. – LotPings

ответ

2

В Windows CMD с Cygwin, используйте эту команду: sed

sed -e 's/\(something\)/\\\\\1/g' file 
+0

Спасибо за ваши предложения, на самом деле работают четыре слэша. Существует ли кросс-платформенное решение? Мне нужен файл, который можно дважды щелкнуть на Windows, а также работать с терминалом на Mac/Linux. – Martin

+0

'Windows' cmd unescape all '\' автоматически, поэтому, возможно, если вы завершите эту команду sed в скрипте bash и запустите ее из cmd, как: 'c: \ bla \ bla> sh -c" my_bash_with_sed.sh ", там это шанс, который будет работать (если sh.exe установлен с cygwin). –

+0

@Martin Вы можете попробовать без одинарных кавычек: 'sed -e s/\\ (что-то \\)/\\ & /', поскольку оболочка POSIX будет расширяться \\ до \, когда она не находится в кавычках. – andlrc

1

Вы можете запустить скрипт из пакетного файла

myBatch.bat

@echo off 
c:\cygwin64\bin\bash ./mySed 

mySed

#!/bin/bash 
echo asdfsomethingasdf | sed 's/\(something\)/\\\1/g' 

Это может быть необходимо использовать /usr/bin/sed, когда ваш путь не полностью установлен

Смежные вопросы