Это на самом деле довольно просто в PowerShell :
function Number-Lines($name) {
Get-Content $name | ForEach-Object { $i = 1 } { "{0:000}. {1}" -f $i++,$_ }
}
То, что я делаю здесь, это получение содержимого файла, это вернет String[]
, по которому я итерирую с ForEach-Object
и применю строку формата, используя оператор -f
. Результат просто выпадает из конвейера как еще один String[]
, который может быть перенаправлен в файл при необходимости.
Вы можете немного сократить его, используя псевдонимы:
gc .\someFile.txt | %{$i=1}{ "{0:000}. {1}" -f $i++,$_ }
но я не буду рекомендовать это для определения функции.
Кстати, вы хотите рассмотреть возможность использования двух проходов и построения строки формата на лету, чтобы приспособиться к большему количеству строк. Если имеется 1500 строк {0:000}
, этого больше не будет достаточно, чтобы получить аккуратно выровненный вывод.
Что касается языка, который лучше всего подходит для таких задач, вы можете посмотреть на такие факторы, как
- краткость кода (Perl там будет трудно победить, особенно в одном ответе на другой)
- удобочитаемость и удобство обслуживания кода
- доступность инструментов (Perl и Python по умолчанию не установлены в Windows (PowerShell только после Windows 7), поэтому развертывание может быть затруднено.)
В свете последнего пункта вам, возможно, будет даже лучше использовать cmd
для этой задачи. Код также довольно прост:
@echo off
setlocal
set line=1
for /f "delims=" %%l in (%1) do call :process %%l
endlocal
goto :eof
:process
call :lz %line%
echo %lz%. %*
set /a line+=1
goto :eof
:lz
if %1 LSS 10 set lz=00%1&goto :eof
if %1 LSS 100 set lz=0%1&goto :eof
set lz=%1&goto :eof
goto :eof
Это предполагает, конечно, что он должен работать где-то еще, кроме вашей собственной машины. Если нет, то используйте то, что соответствует вашим потребностям: -)