अंतिम बिंदु के बाद 2 में चर विभाजित करें


1

मुझे अंतिम बिंदु के बाद दो छोटे चर में चर काटने की जरूरत है। उदाहरण के लिए चर " european.union" होगा vara=europeanऔरvarb=union

मैं इस उद्देश्य को पूरा करने के लिए निम्नलिखित कोड का उपयोग करता हूं:

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

समस्या यह है कि यह कोड कई " ." विभाजित चर का प्रबंधन नहीं कर सकता है । उदाहरण के लिए चर spain is in.the.european.unionपूरी तरह से इस कोड को बेकार बना देगा।

vara="spain is in" varb=the उत्पादन होगा, लेकिन मुझे ज़रूरत है vara="spain is in.the.european" varb=union

Var रिक्त स्थान के बारे में चिंता न करें, मैं उन्हें प्रबंधित कर सकता हूं।

मैं अंतिम बिंदु पर चर को विभाजित करना चाहता हूं, .लेकिन मुझे नहीं पता कि इसे कैसे पूरा किया जाए। मैंने सभी टोकनों को N-1 में मिलाने के लिए टोकन की कुल संख्या को पढ़ने की कोशिश की, लेकिन यह काम नहीं किया। स्क्रिप्ट द्वारा विश्लेषण किए जाने से पहले डॉट्स की संख्या जानने में असमर्थ होने के कारण यह कठिन है। कोई उपाय?

जवाबों:


2

मेरा सुझाव PowerShell ;-) का उपयोग करना है।

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

उत्पादन:

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

PS C:\WINDOWS\system32> $varb
union

इसे cmd स्क्रिप्ट में उपयोग करने के लिए, यह सही %vara%और %varb%सही तरीके से सेट करेगा , इसे अपनी 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%इस मामले में शामिल है spain is in.the.europeanऔर %varb%शामिल unionहै

स्पष्टीकरण:

  • Substring(0, $text.lastIndexOf('.'))स्ट्रिंग की शुरुआत से सब कुछ मिलता है ( 0) आखिरी तक.
  • split('.')[-1] प्रत्येक बिंदु पर अपनी स्ट्रिंग को विभाजित करता है और बनाए गए सरणी में अंतिम मान प्राप्त करता है

Thx, यह काम करता है !!!

1

निम्नलिखित (आंशिक रूप से टिप्पणी की गई) कोड स्निपेट शुद्ध बैच-फ़ाइल समाधान दिखाता है:

@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

नमूना उत्पादन :

==> 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"

संसाधन (आवश्यक पढ़ना, अधूरा):


0

यह "धोखा" हो सकता है, लेकिन, जब तक आपका सीमांकक डॉट (" .") है, आप एक चाल का उपयोग कर सकते हैं: दिखावा करें कि आपका स्ट्रिंग एक फ़ाइल नाम है:

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और पथनाम के रूप में %%~xAव्यवहार करें %%Aऔर क्रमशः आधार फ़ाइल भाग और विस्तार को निकालें। बेस फ़ाइलनाम को अंतिम बिंदु तक सब कुछ परिभाषित किया गया है, इसलिए यह आपका है vara। विस्तार अंतिम बिंदु है और इसके बाद सब कुछ है (उदाहरण के लिए, " .txt"), जो आप नहीं चाहते हैं। इसलिए हम एक्सटेंशन को असाइन करते हैं varb_plus- यह varbप्लस डॉट के लिए वांछित मान है । फिर for /f "delims=. tokens=1" डॉट के बाद भाग प्राप्त करने के लिए उपयोग करना आसान है ।

क्योंकि बेस फाइलनाम भाग%%~nA को वापस कर रहा है , यह विफल हो जाएगा यदि आपका पूर्ण चर शामिल है या । आप को देखकर इस संभाल करने के लिए सक्षम हो सकता है (के पथ हिस्सा ), लेकिन यह तुरंत स्पष्ट ऐसा करने के तरीके नहीं है - विशेष रूप से अगर यह शामिल कर सकते हैं या तो या ।%%A/\%%~pA%%A /\


मेरे पास परीक्षण द्वारा मूल्य में स्लैश को संभालने के तरीके पर कुछ विचार हैं %%~pA; अगर आपको उनकी आवश्यकता हो तो मुझे बताएं।
जी-मैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.