Remove o caminho absoluto do arquivo com o bash

0

Eu tenho o arquivo "list.txt" contendo caminhos absolutos para outros arquivos

/home/lin/bash/aaa
/home/lin/bash/song.mp3
/home/lin/bash/doc.html
/home/lin/bash/directory

Eu quero atribuir caminho à variável

path="/home/lin/bash/song.mp3"

e, em seguida, remova toda a linha desse caminho. Eu tentei

sed -i '$path' list.txt

e muitos outros comandos com grep, echo mas nada funciona.

    
por Mike Naplet 22.01.2018 / 16:04

3 respostas

0

Existem dois problemas com a sua solução. Primeiro, desde que você esteja usando aspas simples para '$path' , essa expressão é tratada literalmente e não como a variável $path . Para resolver isso, use aspas duplas "$path" . Mas você enfrentará o segundo problema: você quer usar a barra / como um símbolo sed especial e ao mesmo tempo esse símbolo está presente nos caminhos, o que confundirá sed . Portanto, você tem que usar algum outro símbolo em vez de barra, por exemplo, use vírgula

$ sed -i "s,${path},," list.txt
$ cat list.txt
/home/lin/bash/aaa

/home/lin/bash/doc.html
/home/lin/bash/directory

Existe outra abordagem bonita, sugerida por Tim Kennedy (veja explicação de como funciona na discussão abaixo), que não deixa a linha em branco

$ sed -i "\,${path},d" list.txt
$ cat list.txt
/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
    
por 22.01.2018 / 16:23
2

Tente novamente a abordagem grep - isso funcionará:

grep -xv "$path" list.txt > tmp_$$ && mv tmp_$$ list.txt

O conteúdo final de list.txt :

/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
    
por 22.01.2018 / 16:13
0

Você poderia fazer isso com GNU sed e double qoutes para expandir a variável.

sed -i.bak "\:^${path}$:d" list.txt
  • Aqui, usamos -i para substituir / excluir no local os padrões correspondentes, como em $path , o .bak está fazendo um backup do arquivo list.txt original com list.txt.bak
  • Usamos um separador diferente para evitar a falha sed com barras / em $path conterá.
  • Usamos o início da linha ^ e o fim da linha $ anchors para corresponder ao caminho na linha inteira não parcialmente se correspondido.
  • Escapamos ao abrir o primeiro delimitador, pois é obrigatório quando o delimitador é diferente de barra / . em man sed documentado.

    \cregexpc
        Match lines matching the regular expression regexp.
        The c may be any character.
    

    na verdade, isso está dizendo sed que o próximo caractere é nosso delimitador .

por 22.01.2018 / 16:16

Tags