Extraia parte de uma linha até uma string específica

Extraia parte de uma linha até uma string específica

Suponhamos que eu tenha um arquivo com linhas como:

/java/jdkxx/jvm_jdk/bin/opt
/java/jre/jre_jvm/bin/opt
/foo/bar/bin/other/stuff/here

Existe uma maneira de extrair parte das linhas até bin. Quero dizer, suponha que essas linhas estejam file.txtentão

$ <some_command> file.txt 
/java/jdkxx/jvm_jdk/bin/
/java/jre/jre_jvm/bin/
/foo/bar/bin/

Responder1

Existem diversas formas de fazer isto. Aqui estão alguns:

# greedily caputure up to the last slash
grep -o '.*/bin/' file.txt
# remove all non-slash chars from the end of each line
sed 's#\(/bin/\).*$#\1#' file.txt
# using slash as a delimiter, blank out the last field
awk -F/ -v OFS=/ '{for (i=1; i<=NF; i++) if ($i == "bin") {NF=i; break}} 1' file.txt

Responder2

Uma maneira pura de bash:

while read -n line
do
    [[ $line =~ /bin/ ]] && printf "%s\n" "${line/%\/bin\/*//bin/}"
done

Responder3

O que, sem Perl?

perl -ne 's#/bin\K.*## && print' file

Se você sabe dissotodoslinhas contêm o padrão desejado, você pode simplificar para:

perl -pe 's#/bin\K.*##' file

The \Ké uma expressão PCRE que significa “ignorar tudo antes de \K”.


Você também pode fazer coisas como

awk -F"/bin" '{print $1FS}' file

Isso define o delimitador de campo do awk ( FS) como /bine, em seguida, imprime o primeiro campo e o valor de FS(que é /bin). Esse, novamente, pressupõe que você deseja todas as linhas. Caso contrário, use este:

awk -F"/bin" '($2){print $1FS}' file

Responder4

Junto com outras boas respostas, você também pode tentar o seguinte, que garantirá que o que houver depois /bin/não será impresso:

grep -Po ".*/(?<=/bin/)" file

Exemplo:

$ cat test_file 
/java/jdkxx/jvm_jdk/bin/opt
/java/jre/jre_jvm/bin/opt/home

$ grep -Po ".*/(?<=/bin/)" test_file 
/java/jdkxx/jvm_jdk/bin/
/java/jre/jre_jvm/bin/

Aqui estamos usando oPCREcom um olhar positivo para trás (?<=/bin/)para ter certeza de que levaremos apenas até onde finalmente /chegamos ./bin/

informação relacionada