Как заменить только один экземпляр строки в пакете - PullRequest
0 голосов
/ 22 декабря 2018

Я искал по всему интернету, но безрезультатно.Как бы вы заменили только одну находку строки в партии?Допустим, у меня есть код:

SET string=chair chair book

Есть ли способ заменить слово «стул» только один раз?Что-то вроде этого?

chair book

Я использовал функцию редактирования замены, выполнив

SET furniture=%string:chair=%

Но это заставляет все экземпляры стула исчезать в

book

У кого-нибудь из вас есть решение?

РЕДАКТИРОВАТЬ: Извините за любые недоразумения, я имел в виду первый экземпляр строки заменен.Например, учитывая

chair chair chair book

и слово «стул», оно вывело бы

chair chair book

Что касается второй мысли, думаю, я бы хотел, чтобы за один раз было заменено только одно слово.,Итак, учитывая "стул"

table desk chair chair book chair candle lamp lamp desk

Это было бы

table desk chair book chair candle lamp lamp desk

Мне очень жаль за путаницу, надеюсь, что это прояснилось!

Спасибо, LardPies

1 Ответ

0 голосов
/ 22 декабря 2018

Это можно сделать с помощью простого цикла for.Взяв мой предоставленный код непосредственно из примера из этого поста от Стефан - Мы берем каждое слово из вашего String, а затем просто проверяем, не было ли оно уже использовано в пуле слов.

RemoveAllDuplicateWords.bat :

@ECHO OFF
@setlocal EnableDelayedExpansion

Set "String=table desk chair chair book chair candle lamp lamp desk"
set "newstring="

for %%i in (%string%) do (
  echo !newstring!|findstr /i "\<%%i\>" >nul || set "newstring=!newstring! %%i"
)
Set "furniture=%newstring:~1%"

Echo %furniture%

Как указано Стефаном, удалите /i, если вы хотите, чтобы фильтр чувствителен к регистру.


РЕДАКТИРОВАТЬ:

Таким образом, из-за недоразумения по запросу потока, я привел РЕДАКТИРОВАТЬ, которая решит сообщение пользователя (Надеюсь).Исходя из его разъяснения, он / она хочет не удалять дублирующиеся слова из строки, а дублировать слова рядом друг с другом.

До: table desk chair chair book chair candle lamp lamp desk

После: table desk chair book chair candle lamp lamp desk

Этот процесс прост, но может усложниться.Мой процесс состоит в том, чтобы просто сравнивать каждое слово по предшествующему слову в строке.Это займет Table Chair Chair Desk или Table Chair Chair Chair Desk или Table Chair Chair Chair Chair Desk (вы получите точку) и измените его на Table Chair Desk.

Поскольку этот скрипт довольно длинный, вы не захотите вставлять его для каждогострока.Удивительное решение для этого - call.Как я превратил это в функцию.Ниже я объясню, как его использовать.

Команда: Call :RemoveMultipleWords [String You Want Edited] [New String]

Пример: Call :RemoveMultipleWords String Furniture

Пожалуйстаимейте в виду, что вы также можете редактировать оригинальную строку, это тоже само.Это означает, что вместо String Furniture вы можете поставить String String.

RemoveOnlyDouble + Instances.bat:

@ECHO OFF
@setlocal EnableDelayedExpansion

Rem | Original String's
Set "Furniture=table desk chair chair book chair candle lamp lamp desk"
Set "Food=Lasagne Fettuccine_Alfredo Carbonara Carbonara Culatello Breadsticks Tortano Tortano"

Rem | Call To Fix Function
Call :RemoveMultipleWords Furniture Furniture
Echo !Furniture!

Call :RemoveMultipleWords Food IntlianFoods
Echo !IntlianFoods!

Rem | Exit BATCH
Pause
Exit /b

:RemoveMultipleWords
Rem | Reset LoopCount
Set "LoopCount=0"

Rem | Process Each Item
for %%A in (!%1!) do (

    Rem | Get Current Word
    Set "CurrentWord=%%A"

    Rem | Set First Word
    If "!LoopCount!"=="0" (

        Rem | Set LoopCount
        Set "LoopCount=1"

        Rem | First Run
        Set "%2=%%A"

    ) ELSE (

        Rem | Upcoming Runs
        If "!LoopCount!"=="1" (

            Rem | First Word
            Set "LastWord1=%%A"

            Rem | Add LoopCount
            Set "LoopCount=2"

            Rem | Echo Results
            If not "!LastWord2!"=="%%A" (Set "%2=!%2! !CurrentWord!")

        ) ELSE (

            Rem | Next Word
            Set "LastWord2=%%A"

            Rem | Subtract LoopCount
            Set "LoopCount=1"

            Rem | Echo Results
            If not "!LastWord1!"=="%%A" (Set "%2=!%2! !CurrentWord!")

        )
    )
)
Goto :EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...