Как заменить определенные текстовые вхождения в нескольких файлах .mac - PullRequest
0 голосов
/ 12 июня 2018

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

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

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

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

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

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

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

maccmd /replace "Metal" "Steel" 

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

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

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Следующий (назовем его 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"
0 голосов
/ 12 июня 2018

нашел решение с помощью 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 
  }

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