Nano Hash - криптовалюты, майнинг, программирование

Как заменить определенные вхождения текста в нескольких файлах .mac

Я хочу заменить конкретное появление слова «Металл» в ряде .mac-файлов. Насколько я понял, это текстовые файлы.

Первый пример файла:

Размер : 24 мм 1547856 Металл
Цвет : красный
Номер : 1547856 Металл

Второй пример файла:

Размер : 26 мм 2658915 Металл
Цвет : синий
Номер : 2658915 Металл

Я хочу заменить Number : 1547856 Metal на Number : 1547856 Steel в первом файле и Number : 2658915 Metal на Number : 2658915 Steel во втором файле, но не хочу заменять "Metal" в первой строке.

Я попытался сделать это с помощью следующего кода через Терминал, но он заменяет все вхождения "Metal" в файлах:

maccmd /replace "Metal" "Steel" 

Как заменить только "Металл" в строке, которая начинается с "Число", не заменяя никакие другие вхождения "Металл" в файле?

Я ничего не знаю о программе maccmd. Так что я в порядке с простой пакетной программой Windows.


  • Не было бы проще использовать родную оболочку и иметь возможность использовать sed и awk? 12.06.2018
  • Спасибо, Макс Воллмер, это очень дружелюбно! 12.06.2018
  • Возможно, вы захотите изучить регулярные выражения. Я не могу опубликовать полный ответ прямо сейчас, но если эта команда /replace позволяет использовать регулярные выражения, это должно быть довольно просто. Это может помочь. 12.06.2018
  • @MaxVollmer Мне это нужно для терминала Windows, потому что у меня есть файлы .mac на компьютере с Windows. Я не могу установить оболочку unix. 12.06.2018
  • @aschipfl У меня есть только терминал Windows 12.06.2018
  • А, ладно, извините за недоразумение! 12.06.2018

Ответы:


1

нашел решение с PowerShell, но оно работает только для текстовых файлов.

$find="world"
$replace="nice"
$path="path to folder"
$position=0

Get-ChildItem $path -Filter * | 
Foreach-Object {
    $file = $_.FullName

    $string=Get-Content $file -Raw
    $pos=$string.IndexOf($find, $string.IndexOf($find)+$position)


  if ($pos -ne -1)
  {
      "{0}{1}{2}" -f $string.Substring(0, $pos), $replace, $string.Substring($pos + $find.Length) | Out-File -filepath $file 
  } else {
     $string | Out-File -filepath $file 
  }

}
12.06.2018
  • Эта программа работает только с текстовыми файлами. Когда я пытаюсь сделать это с моими файлами .mac, я не могу потом их открыть. Кто-нибудь знает, что я могу попытаться сделать, чтобы справиться с файлами .mac? 13.06.2018
  • Что такое файл .mac? Я предполагаю, что это текстовый файл, использующий определенную кодировку и/или стиль разрыва строки, поэтому, пожалуйста, сообщите нам... 13.06.2018

  • 2

    Следующий batch-file (пусть мы назовем его replac.bat) работает, только если текстовый файл не содержит ||, если используются разрывы строк в стиле DOS-/Windows или Unix (CR + LF или LF соответственно) и если используется кодировка ASCII-/ANSI- текст:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem // Define constants here:
    set "_FILE=%~1"    & rem // (file to process; use first command line argument)
    set "_FIND=Number" & rem // (string at beginning of lines to find lines to process)
    set "_SRCH=Metal"  & rem // (string at end of lines to be replaced)
    set "_REPL=Steel"  & rem // (string to replace found string at end of lines)
    
    for /F "delims=" %%L in ('findstr /N "^" "%_FILE%"') do (
        for /F "tokens=1-2 delims=: " %%I in ("%%L") do (
            set "LINE=%%L" & set "ITEM=%%J"
            setlocal EnableDelayedExpansion
            set "EXCH=!LINE!||" & set "EXCH=!EXCH:%_SRCH%||=%_REPL%||!" & set "EXCH=!EXCH:||=!"
            if "!ITEM!"=="%_FIND%" (
                echo(!EXCH:*:=!
            ) else (
                echo(!LINE:*:=!
            )
            endlocal
        )
    )
    
    endlocal
    exit /B
    

    Текстовый файл (допустим, sample.txt) должен быть указан в качестве аргумента командной строки, например:

    replac.bat "sample.txt"
    

    Чтобы записать вывод в другой файл (допустим, return.txt), используйте перенаправление, например:

    replac.bat "sample.txt" > "return.txt"
    
    13.06.2018
    Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..