Eu tenho um comando de substituição sed que gostaria de ser compatível com o BSD sed
e o GNU sed
. Expressões regulares estendidas não são um problema, pois não preciso delas neste caso. Meu principal problema é a diferença na maneira como os dois sed
interpretam as seqüências de escape de caracteres nas seqüências de caracteres de substituição . Meu cadeia de substituição contém guias e novas linhas e eu gostaria que eles sejam visíveis nas cadeias de comando para facilitar a manutenção, no entanto, BSD sed
não interpreta as seqüências de escape e GNU sed
faz . Qual é a maneira apropriada de instruir sed
para interpretar essas seqüências de escape no BSD? Os dois trechos a seguir resumem meu problema:
GNU sed
echo ABC | sed 's/B/\n\tB\n'
yeilds
A
B
C
BSD sed
echo ABC | sed 's/B\n\tB\n'
rendimentos
AntBnC
Claramente, \n
e \t
não são interpretados como seqüências de escape pelo BSDsed
Agora, a minha pergunta. De acordo com a página de sed
manual do BSD :
Para especificar um caractere de nova linha na sequência de substituição, preceda-o com uma barra invertida.
Isso implica que eu precisaria preceder uma nova linha literal por uma barra invertida? Qual é a maneira apropriada de instruir sed
para interpretar seqüências de escape como \n
no texto de substituição?
sed
. No final, provavelmente fará sentido usar o awk. Então, o que você acha da interpretação da página de manual do BSD sed que citei?Respostas:
Se você precisar escrever scripts portáteis, deve se ater aos recursos do padrão POSIX (também conhecido como Single Unix ou Open Group Base Specification). A edição 7, também conhecida como POSIX-1.2008, é a mais recente, mas muitos sistemas ainda não terminaram de adotá-la. A edição 6, também conhecida como POSIX-1.2001, é geralmente fornecida por todos os órgãos modernos.
No sed , o significado de seqüências de escape como
\t
e\n
não é portátil, exceto que em uma regex ,\n
significa uma nova linha. No texto de substituição de ums
comando,\n
não é portátil, mas você pode usar a sequência barra invertida-nova linha para representar uma nova linha.Uma maneira portátil de gerar um caractere de tabulação (ou qualquer outro caractere expresso em octal) é com
tr
. Armazene o caractere em uma variável de shell e substitua essa variável no snippet sed.Observe novamente que as novas linhas precisam ser expressas de maneira diferente nas regexes e nos
s
textos de substituição.Você pode querer usar o awk . Permite escapes de barra invertida, incluindo escapes octais
\ooo
, em cada literal de string.fonte
Você pode usar as
$'...'
citações do bash para interpretar as fugas antes de passar a string parased
.Na página do manual do bash:
fonte
Isso foi respondido no Stack Overflow:
/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
É exatamente o que jw013 disse.
Para inserir uma guia literal, digite ctrl+ VTab.
fonte