Como extrair string entre enésima e enésima ocorrência de um padrão?

Como extrair string entre enésima e enésima ocorrência de um padrão?

Eu tenho um arquivo path.txt com o caminho para um arquivo (digamos, um arquivo txt):

/Folder/F1/F2/F3/F4/.../Fn/abc.txt

Quero extrair o caminho, ou seja, a string do início até a última ocorrência /(já que o número da pasta no caminho pode variar).

Eu quero obter:

/Folder/F1/F2/F3/F4/.../Fn

Qual seria a melhor escolha: sed/awk/perl/vi e como?

Responder1

Se quiser usar uma dessas ferramentas que você mencionou, você pode fazer isso com sed:

echo "/Folder/F1/F2/F3/F4/.../Fn/abc.txt" | sed "s/\/[^/]*$//"
sed -i "s/\/[^/]*$//" path.txt

Se você estiver no bash, poderá usar a expansão de parâmetros do Bash para isso:

path=$(cat path.txt)
echo "${path%/*}"

E como mencionado porikkachuvocê pode usar dirname.

Responder2

basenamee dirnameimprima a última e a última parte de um nome de arquivo fornecido como argumento, então:

$ dirname "/Folder/F1/F2/F3/F4/.../Fn/abc.txt" 
/Folder/F1/F2/F3/F4/.../Fn

(ou de um arquivo: dirname "$(< pathname.txt)" )

informação relacionada