como usar sed quando uma variável contém '/' nele?

3

Eu tenho a seguinte linha para executar em um script e excluir duas linhas acima. Mas agora minha variável $ TEST contém valores como '/ DATA / test10' e meu ID de variável contém '10'. Como posso usar isso com sed?

sed -i ":a;N;s/\n/&/2;Ta;/path = $TEST\/$ID/s/.*//;P;D" /collection.txt
    
por Vishnu 21.11.2015 / 11:46

4 respostas

5

Se você simplesmente quiser tratar uma string como um literal em sed já existe uma resposta para isso:

escaped_testx="$(sed -e 's/[\/&]/\&/g' <<< "$TEST"; echo x)"
escaped_test="${escaped_testx%x}"

O x extra é capaz de lidar com novas linhas , que seriam removidas de outra forma pela substituição de comandos .

    
por 21.11.2015 / 12:20
2

Usar / como o caractere de separação para o comando sed s não é obrigatório. O separador é o primeiro caractere após o s. Você pode usar | ou # ou (quase) o que quiser. Para coisas com muitos caracteres / , como caminhos de nome de arquivo, eu gosto de usar vírgulas porque elas ficam abaixo da linha de base e são, portanto, mais fáceis de ver, sendo muito raras em nomes de arquivos:

sed 's,^/home/me/subdir/,^/home/he/otherdir/,'

Escolha um personagem que você não encontrará em sua pesquisa e substitua. Se você tiver um ou dois, prefixe-os com barras invertidas.

    
por 21.11.2015 / 18:06
0

Nas expressões regulares, você pode escapar de caracteres ao adicionar uma barra invertida.

Portanto, / se torna \/ .

Isso fará com que seu regex pareça oculto ( s/\/home\/stuff\/dir1/\/home\/stuff/ ), mas funciona!

    
por 21.11.2015 / 12:09
0

Se você quiser evitar modificar o valor da sua variável, basta transmitir:

printf "%s\n" "$PATH/$ID"   |
sed   -e's|[]$/.\^[]|\&|g' \
      -e's|.*|/path = &/g|' |
sed   -e':a;N;s/\n/&/2;Ta' -f- -eP\;D /collection.txt

Assume-se que nenhuma das variáveis pode conter uma nova linha. Também faz uma suposição sobre:

/path = $TEST\/$ID/s/.*//

... o que é que você só quer limpar a linha. Você pode usar apenas g et para sobrescrever o espaço padrão com seu espaço vazio em branco - (pelo menos, ele ficará em branco neste script, pois não é usado no exemplo) . Você também pode usar z ap em um GNU sed para obter a mesma coisa.

    
por 25.11.2015 / 16:23