Dividir variável em 2 após o último ponto

1

Eu preciso cortar variáveis em duas variáveis menores após o último ponto. Por exemplo, a variável " european.union " será vara=european e varb=union

Eu uso o seguinte código para alcançar este objetivo:

for /f "tokens=1 delims=." %%a in ("%elvariato%") do set vara=%%a
for /f "tokens=2 delims=." %%a in ("%elvariato%") do set varb=%%a

O problema é que esse código não pode gerenciar várias variáveis de divisão " . ". Por exemplo, a variável spain is in.the.european.union tornaria este código totalmente inútil.

vara="spain is in" varb=the seria a saída, mas eu preciso de vara="spain is in.the.european" varb=union

Não se preocupe em espaços var, eu posso gerenciá-los.

Eu quero dividir a variável no último ponto . , mas não sei como conseguir isso. Eu tentei ler o número total de tokens para mesclar todos os tokens até N-1, mas não funcionou. Ser incapaz de saber o número de pontos antes que a variável seja analisada pelo script faz com que seja difícil. Alguma sugestão?

    
por Ben N 13.03.2018 / 03:16

3 respostas

2

minha sugestão é usar o PowerShell; -).

$text = "spain is in.the.european.union"
$vara = $text.Substring(0, $text.lastIndexOf('.'))
$varb = $text.Split(".")[-1]

saída:

PS C:\WINDOWS\system32> $vara
spain is in.the.european

PS C:\WINDOWS\system32> $varb
union

para usar isso em um script cmd, isso definirá %vara% e %varb% corretamente, para usá-lo ainda mais em seu script cmd.

for /f "delims=" %%a in (' powershell "$env:elvariato.Substring(0, $env:elvariato.lastIndexOf('.'))" ') do set "vara=%%a"
for /f "delims=" %%a in (' powershell "$env:elvariato.split('.')[-1]" ') do set "varb=%%a"

%vara% contém spain is in.the.european e %varb% contém union neste caso

Explicação:

  • Substring(0, $text.lastIndexOf('.')) obtém tudo desde o início da string ( 0 ) até o último .
  • split('.')[-1] divide sua string em cada ponto e obtém o último valor na matriz criada
por 13.03.2018 / 17:49
1

O seguinte trecho de código (parcialmente comentado) mostra a solução pura de arquivo em lote:

@ECHO OFF
rem default/expected: SETLOCAL EnableExtensions DisableDelayedExpansion
if "%~1"=="" (
  set "elvariato=spain is in.the.european.union"      asked example value
) else (
  set "elvariato=%~1"                                 supplied sample value 
)
set "_dot_pos="      
set "nodots=%elvariato:.=%"                           check for any dot presence
if "%nodots%"=="%elvariato%" goto :jjloopEnd          
set /a jj=1
:jjloop              compute last dot position (counted from the end of string)
  call set "_auxiliary=%%elvariato:~-%jj%%%"
  set "_aux_1char=%_auxiliary:~0,1%"
  if "%_aux_1char%"=="." (
      set /A _dot_pos=jj
      set /A _dot_pre=jj - 1
      goto :jjloopEnd
  )
  set /a jj+=1
  goto :jjloop
:jjloopEnd
if not defined _dot_pos (
    rem string does not contain any dot character at all
    set "vara=%elvariato%"
    set "varb="
    goto :showResults
)
call set "vara=%%elvariato:~0,-%_dot_pos%%%"
if %_dot_pos% EQU 1 (
    set "varb="
) else (
    call set "varb=%%elvariato:~-%_dot_pre%%%"
)
:showResults
rem debugging output 
echo vara="%vara%" varb="%varb%"
goto :eof

Exemplo de saída :

==> D:\bat\SU02882c.bat
vara="spain is in.the.european" varb="union"

==> D:\bat\SU02882c.bat "."      a dot only
vara="" varb=""

==> D:\bat\SU02882c.bat "nodots"
vara="nodots" varb=""

==> D:\bat\SU02882c.bat ".leading dot only"
vara="" varb="leading dot only"

==> D:\bat\SU02882c.bat "trailing dot only."
vara="trailing dot only" varb=""

==> D:\bat\SU02882c.bat "1st.dot.2nd.dot.another.dot.more.dots"
vara="1st.dot.2nd.dot.another.dot.more" varb="dots"

Recursos (leitura obrigatória, incompleta):

por 13.03.2018 / 20:24
0

Isso pode ser "trapaça" mas, desde que o seu delimitador seja ponto (" . "), você pode usar um truque: finja que sua string é um nome de arquivo:

setlocal enabledelayedexpansion
    ︙
for %%A in (%elvariato%) do set "vara=%%~nA" & set "varb_plus=%%~xA"
for /f "delims=. tokens=1" %%B in ("!varb_plus!") do set varb=%%B

%%~nA e %%~xA tratam %%A como um nome de caminho e extrair a parte do nome do arquivo base e a extensão, respectivamente. O nome do arquivo base é definido para ser tudo até o último ponto, então esse é seu vara . A extensão é o último ponto e tudo depois dele (por exemplo, " .txt ") que não é o que você quer. Então, atribuímos a extensão a varb_plus - é o valor desejado para varb mais um ponto. Então é fácil usar for /f "delims=. tokens=1" para pegar a parte depois do ponto.

Porque %%~nA está retornando a parte do nome de arquivo base de %%A , isso falhará se sua variável completa contiver / ou \ . Você pode conseguir lidar com isso observando %%~pA (a parte do caminho de %%A ), mas não é imediatamente óbvio como fazer isso especialmente se puder conter / ou \

    
por 08.04.2018 / 08:01