Como substituir o caractere no grupo de captura por sed

1

Dado um padrão do formulário:

a\b\c\d:text\text

como posso usar o sed para a saída

a/b/c/d:text\text

isto é, dado um caminho usando barras invertidas seguidas de dois-pontos seguidos por texto arbitrário, como eu substituo apenas as barras invertidas que precedem os dois pontos por barras?

    
por thetic 23.08.2017 / 04:13

2 respostas

2

Algumas maneiras de fazer isso; aqui está um:

sed -e ':a' -e 's_^\([^:]*\)\_/_;t a'

Explicação breadcrumbs:

-e especifica um comando de edição. Existem dois comandos desse tipo aqui.

:a define um rótulo que pode ser usado em declarações "goto".

O comando s substitui a primeira barra invertida na linha por uma barra, desde que a primeira barra invertida ocorra antes de qualquer caractere de dois-pontos.

O comando t a ramifica para o rótulo :a , desde que uma substituição tenha sido feita com êxito com o comando s . (Condicional "goto")

    
por 23.08.2017 / 04:29
2

Usando awk em vez de sed :

awk -v FS=':' -v OFS=':' '{ gsub(/\/,"/",$1) } { print }'

Isso trata os dados como um registro : -delimited e usa gsub() para substituir todas as barras invertidas por barras no primeiro campo. Em seguida, envia os dados modificados.

Eu configurei o separador de campo de entrada ( FS ) e o separador de campo de saída ( OFS ) como : para que a entrada seja dividida nos dois pontos e para que os dois pontos sejam inseridos novamente quando a saída acontece.

Se você tem o texto em uma variável shell, você pode fazer isso diretamente no shell sem usar nenhum utilitário externo também:

a='a\b\c\d:text\text'
b=${a%%:*}  # the start of the string ("remove the first : and everything after it from $a")
c=${a#*:}   # the end of the string ("remove the first : and everything before it from $a")

a="${b//\//}:$c"

printf '%s\n' "$a"

Este trecho de código imprimirá a string a/b/c/d:text\text em qualquer sh -shell que suporte a expansão de parâmetro ${parameter//pattern/string} (uma extensão para o padrão POSIX).

Isso é mais ou menos imitando o código awk .

    
por 23.08.2017 / 08:20

Tags