Как я могу сделать эту команду SED более переносимой?

332
WilliamKF

Я использую следующую sedкоманду:

cat version | sed -e 's/[0-9][0-9][0-9][0-9][0-9:M]*-[abp]/Ver\n/' 

Что нормализуется так:

4330M-p -> Ver<newline> 

Это прекрасно работает с GNU SED, но с BSD SED в Mac OS X, \ n превращается в nэто:

4330M-p -> Vern 

Чтобы нормализовать некоторые выходные данные, которые содержат номер версии, который со временем меняется на статическую строку, за которой следует символ новой строки. Это используется как часть тестирования, где выходные данные после sedобработки сравниваются diffс помощью известного золотого файла, и мы не хотим сбоев из-за изменения номера версии, и в дальнейшем нам нужна новая строка для наших целей.

Как заменить строку, которая добавляет новую строку таким образом, чтобы она работала как в GNU, так и в версии BSD sed, или я должен просто установить GNU sedв Mac OS X, потому что это невозможно сделать?

0
Я не пробовал BSD sed, но, возможно, что-то вроде `\ d13` или что-то вроде` \ x0a`? это работает в GNU это работает в BSD? barlop 9 лет назад 0
@barlop, нет, обратная косая черта съедается BSD `sed`, а вы получаете` Verd13` и `verx0a`. WilliamKF 9 лет назад 0
это может быть интересно http://stackoverflow.com/questions/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed и http://unix.stackexchange.com / questions / 42321 / how-can-i-instruct-bsd-sed-to-интерпретировать-escape-последовательности-like-n-and-t и http://superuser.com/questions/307165/newlines-in-sed -он-Mac-OS-X barlop 9 лет назад 0

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

0
tekknolagi

Вы можете сделать буквальный перевод строки в вашем скрипте, например, так:

cat version | sed -e 's/[0-9][0-9][0-9][0-9][0-9:M]*-[abp]/Ver\ /' 
Это работает, но безобразно. WilliamKF 9 лет назад 0
@WilliamKF Вы также можете установить GNU sed, но это тоже не лучшее решение. Если у вас есть более красивое решение, то обязательно используйте его. tekknolagi 9 лет назад 0