У меня есть команда замены sed, которую я хотел бы совместить с BSD sed
и GNU sed
. Расширенные регулярные выражения не являются проблемой, так как они мне не нужны в этом случае. Моя основная проблема заключается в том, что эти две sed
пары интерпретируют escape-последовательности символов в строках замены . Моя замена строка содержит вкладки и новую строку , и я хотел бы, чтобы они были видны в командных строках для удобства обслуживания, однако, BSD sed
не интерпретируют управляющие последовательности и GNU sed
делает . Как правильно sed
интерпретировать эти escape-последовательности в BSD? Следующие два фрагмента воплощают мою проблему:
GNU sed
echo ABC | sed 's/B/\n\tB\n'
yeilds
A
B
C
BSD sed
echo ABC | sed 's/B\n\tB\n'
доходность
AntBnC
Очевидно, \n
и \t
не интерпретируются как escape-последовательности BSDsed
Теперь на мой вопрос. Согласно sed
справочной странице BSD :
Чтобы указать символ новой строки в строке замены, поставьте перед ним обратную косую черту.
Означает ли это, что мне нужно предшествовать буквальному переводу строки с помощью обратной косой черты? Как правильно sed
интерпретировать escape-последовательности, как \n
в тексте замены?
sed
. В конце концов, возможно, имеет смысл использовать awk. Так что вы думаете о толковании man-страницы BSD sed, которую я цитировал?Ответы:
Если вам нужно написать переносимые сценарии, вы должны придерживаться функций в стандарте POSIX (он же Single Unix или Open Group Base Specification). Выпуск 7, также известный как POSIX-1.2008, является последним, но многие системы еще не приняли его. Выпуск 6, также известный как POSIX-1.2001 , предоставляется всеми современными организациями.
В sed значение escape-последовательностей, подобных
\t
и\n
не переносимых, за исключением того, что в регулярном выражении ,\n
означает новую строку. В тексте замены дляs
команды\n
не является переносимым, но вы можете использовать последовательность backslash-newline для обозначения новой строки.Переносимый способ создания символа табуляции (или любого другого символа, выраженного в восьмеричном виде) - с помощью
tr
. Сохраните символ в переменной оболочки и замените эту переменную в фрагменте sed.Отметьте еще раз, что переводы строк должны быть выражены по-разному в регулярных выражениях и в
s
текстах замены.Вы можете вместо этого использовать awk . Он позволяет использовать экранирование с обратной косой чертой, включая восьмеричные
\ooo
, в каждом строковом литерале.источник
Вы можете использовать кавычки bash,
$'...'
чтобы интерпретировать escape-символы перед передачей строкиsed
.Со страницы руководства bash:
источник
На этот вопрос ответили на переполнение стека:
/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
Это в значительной степени именно то, что сказал jw013.
Для того, чтобы вставить буквенную вкладку типа ctrl+ VTab.
источник