Variável de divisão 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 atingir esse 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ários " . "dividir variáveis. Por exemplo, a variável spain is in.the.european.union faria totalmente este código inútil.

vara="spain is in" varb=the seria a saída, mas eu preciso 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 eu 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?

Ben N
fonte

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 irá definir %vara% e %varb% corretamente, para usá-lo ainda mais no 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 nesse 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
SimonS
fonte
Thx, funciona !!!
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

Amostra de saída :

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

==> D:\bat\SU\1302882c.bat "."      a dot only
vara="" varb=""

==> D:\bat\SU\1302882c.bat "nodots"
vara="nodots" varb=""

==> D:\bat\SU\1302882c.bat ".leading dot only"
vara="" varb="leading dot only"

==> D:\bat\SU\1302882c.bat "trailing dot only."
vara="trailing dot only" varb=""

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

Recursos (leitura obrigatória, incompleta):

JosefZ
fonte
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 tratar %%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 essa é a sua vara. A extensão é o último ponto e tudo depois dele (por exemplo, “ .txt ”), que não é o que você quer. Então nós atribuímos a extensão para varb_plus - é o valor desejado para varb mais um ponto Então é fácil de usar for /f "delims=. tokens=1" para obter a parte depois do ponto.

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

G-Man
fonte
Eu tenho algumas idéias sobre como lidar com barras no valor testando %%~pA; deixe-me saber se você precisar deles.
G-Man