Dividir uma string por algum separador no bash?

2

Eu gostaria de dividir uma string em substrings, separadas por um separador (que também é uma string).

Como posso fazer isso

  • usando somente o bash? (para o minimalismo e meu interesse principal)

  • ou Se permitir algum programa de processamento de texto? (por conveniência quando o programa está disponível)

Obrigado.

Exemplo simples,

  • divida 1--123--23 por -- em 1 , 123 e 23 .
  • dividir 1?*123 por ?* em 1 e 123
por Tim 14.07.2017 / 22:25

5 respostas

9

Solução pura do bash, usando IFS e read . Observe que as strings não devem conter $'' (ou qualquer outra coisa que você use para o IFS, infelizmente $'$'6'' não funciona, mas, por exemplo, %code% ):

#!/bin/bash

split_by () {
    string=$1
    separator=$2

    tmp=${string//"$separator"/$''}
    IFS=$'' read -a arr <<< "$tmp"
    for substr in "${arr[@]}" ; do
        echo "<$substr>"
    done
    echo
}


split_by '1--123--23' '--'
split_by '1?*123' '?*'

Ou use o Perl:

perl -E 'say for split quotemeta shift, shift' -- "$separator" "$string"
    
por 14.07.2017 / 22:41
3

Concha POSIX pura:

string="1--123--23"
del="--"

while test "${string#*$del}" != "$string" ; do
  echo "${string%%$del*}"
  string="${string#*$del}"
done
echo "$string"

Observe que * ou ? precisam ser escapados no delimitador: del='\*'

    
por 21.09.2017 / 08:08
1

Simplesmente com o awk :

str="1--123--23"
awk -F'--' '{ for(i=1;i<=NF;i++) print $i }' <<< $str

A saída:

1
123
23

Outra solução Python curta:

splitter.py script:

import sys
print('\n'.join(sys.argv[2].split(sys.argv[1])))

ordem dos argumentos:

  • sys.argv[0] - nome do script (por exemplo, splitter.py )

  • sys.argv[1] - separador de substring

  • sys.argv[2] - string de entrada

Uso:

python splitter.py "?*" "1?*123"
1
123
python splitter.py "--" "1--23--123"
1
23
123
    
por 14.07.2017 / 22:47
0

Semelhante a acima, mas diga que você quer apenas obter o URI, por exemplo:

URL="http://something.com/backup/v/photos/path/to/"
URI="./$(echo $URL | awk -F'.com/' '{print $2}')"
echo $URI
    
por 20.09.2017 / 16:05
0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


substring () {
    string=${1}
    separator=${2}
    position=${3}

    substring=${string//"${separator}"/$''}
    IFS=$'' read -a substring <<< "${substring}"
    echo ${substring[${position}]}
}


substring ${@}
    
por 17.01.2019 / 12:30