Как найти и заменить текст в файле, используя среду командной строки Windows?

Чтобы проверить, является ли переменная (включая строку) числом, проверьте, не является ли она числом:

Это работает независимо от того, содержит ли переменная строку или номер.

isNaN(num)         // returns true if the variable does NOT contain a valid number

Примеры

isNaN(123)         // false
isNaN('123')       // false
isNaN('1e10000')   // false (This translates to Infinity, which is a number)
isNaN('foo')       // true
isNaN('10px')      // true

Конечно, вы можете это отрицать, если вам нужно. Например, чтобы реализовать пример IsNumeric, который вы дали:

function isNumeric(num){
  return !isNaN(num)
}

Чтобы преобразовать строку, содержащую число, в число:

работает только в том случае, если только строка содержит числовые символы, иначе он возвращает NaN.

+num               // returns the numeric value of the string, or NaN 
                   // if the string isn't purely numeric characters

Примеры

+'12'              // 12
+'12.'             // 12
+'12..'            // Nan
+'.12'             // 0.12
+'..12'            // Nan
+'foo'             // NaN
+'12px'            // NaN

Чтобы свободно преобразовать строку в число

полезно для преобразования «12px» в 12, например:

parseInt(num)      // extracts a numeric value from the 
                   // start of the string, or NaN.

Примеры

parseInt('12')     // 12
parseInt('aaa')    // NaN
parseInt('12px')   // 12
parseInt('foo2')   // NaN      These last two may be different
parseInt('12a5')   // 12       from what you expected to see. 

Поплавки

Имейте в виду, что, в отличие от +num, parseInt (как следует из названия) преобразует float в целое число, отрубив все после десятичной точки (если вы хотите использовать parseInt() из-за этого поведения, вам, вероятно, лучше использовать другой метод вместо ):

+'12.345'          // 12.345
parseInt(12.345)   // 12
parseInt('12.345') // 12

Пустые строки

Пустые строки могут быть немного противоречивыми. +num преобразует пустые строки в ноль, а isNaN() принимает одно и то же:

+''                // 0
isNaN('')          // false

Но parseInt() не согласен:

parseInt('')       // NaN
449
задан Ray Vega 15 November 2018 в 16:42
поделиться

11 ответов

Загрузите (свободный) Cygwin и используйте подобные Unix команды в командной строке Windows.

Ваш лучший выбор: sed

0
ответ дан jm. 15 November 2018 в 16:42
поделиться

Использовать powershell в .bat - для Windows 7+

кодировка utf8 необязательна, подходит для веб-сайтов

@echo off
set ffile='myfile.txt'
set fold='FOO'
set fnew='BAR'
powershell -Command "(gc %ffile%) -replace %fold%, %fnew% | Out-File %ffile% -encoding utf8"
2
ответ дан Wagner Pereira 15 November 2018 в 16:42
поделиться

Это - одна вещь, которые обрабатывают сценарии в пакетном режиме, просто не преуспевает.

сценарий morechilli , связанный с, будет работать на некоторые файлы, но к сожалению он будет дросселировать на, которые содержат символы, такие как каналы и амперсанды.

VBScript является лучшим встроенным инструментом для этой задачи. См. эту статью для примера: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx

2
ответ дан 15 November 2018 в 16:42
поделиться

Взгляните на . Есть ли в этом вопросе какая-либо утилита, подобная sed для cmd.exe , которая запрашивает эквивалент sed в Windows. Краткое содержание:

  • Это можно сделать в пакетном файле, но это не очень красиво
  • Множество доступных исполняемых файлов сторонних разработчиков, которые сделают это за вас, если у вас есть возможность установить его или просто копирование поверх exe
  • Может быть сделано с VBScript или аналогичным, если вам нужно что-то, что может работать на Windows-боксе без изменений и т. д.
7
ответ дан Community 15 November 2018 в 16:42
поделиться

Если Вы находитесь на версии Windows, которая поддерживает.Net 2.0, я заменил бы Вашу оболочку. PowerShell дает Вам полную мощность .NET из командной строки. Существует много commandlets, встроенные также. Пример ниже решит Ваш вопрос. Я использую полные имена команд, существуют более короткие псевдонимы, но это дает Вам что-то Google для.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
181
ответ дан Michael Haren 15 November 2018 в 16:42
поделиться

BatchSubstitute.bat на dostips.com пример поиска и замены с помощью чистого пакетного файла.

Это использует комбинацию FOR, FIND и CALL SET.

Строки, содержащие символы среди "&<>]|^, можно рассматривать неправильно.

<час>
48
ответ дан Gilles 15 November 2018 в 16:42
поделиться

Я не думаю, что существует способ сделать это с любыми встроенными командами. Я предложил бы, чтобы Вы загрузили что-то как Gnuwin32 или UnxUtils и использовали sed команда (или загрузили [только 115] sed ):

sed -c s/FOO/BAR/g filename
25
ответ дан Pat 15 November 2018 в 16:42
поделиться

Может быть немного поздновато, но я часто ищу похожие вещи, так как не хочу пережить боль одобрения программного обеспечения.

Однако, вы обычно используете оператор FOR в различных формах. Кто-то создал полезный пакетный файл, который выполняет поиск и замену. Посмотрите здесь . Важно понимать ограничения предоставляемого пакетного файла. По этой причине я не копирую исходный код в этом ответе.

.
4
ответ дан 22 November 2019 в 22:53
поделиться

Только что использованный FART (" F ind A nd R ] eplace T ext "служебная программа командной строки):
отличная маленькая бесплатная программа для замены текста в большом наборе файлов.

Файлы установки находятся на SourceForge .

Пример использования:

fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools

предварительный просмотр рекурсивных замен в файлах этого дистрибутива Perl.

Единственная проблема: значок веб-сайта FART не совсем со вкусом, изыскан или элегантен;)


Обновление 2017 г. (7 лет спустя) jagb указывает в комментариях к статья 2011 г. « Простой способ пердежа - поиск и замена текста » от Микаила Тунча

157
ответ дан 22 November 2019 в 22:53
поделиться

Вот решение, которое, как я обнаружил, работает на Win XP. В свой рабочий пакетный файл я включил следующее:

set value=new_value

:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do ( 
  call replace.bat "%%a" _KEY_ %value% config\temp.txt 
)
del config\config.txt
rename config\temp.txt config.txt

Файл replace.bat выглядит следующим образом. Я не нашел способа включить эту функцию в один и тот же командный файл, потому что переменная %% a , кажется, всегда дает последнее значение в цикле for.

replace.bat :

@echo off

:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion

:: Replaces Key Variables
::
:: Parameters:
:: %1  = Line to search for replacement
:: %2  = Key to replace
:: %3  = Value to replace key with
:: %4  = File in which to write the replacement
::

:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1

:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4

:: Restore delayed expansion
::
EndLocal
9
ответ дан 22 November 2019 в 22:53
поделиться

Команда Power shell работает как шарм

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)
3
ответ дан 22 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: