Код PowerShell возвращает больше значений, чем ожидалось -GREP

Добрый вечер. Здесь новичок в Stack Overflow и Powershell.

Приведенный ниже фрагмент кода в Powershell возвращает больше значений, чем мне хотелось. Например, он фиксирует в файле JSON переменные, соответствующие PPVCOUNT, а также переменные, имена которых содержат символы до и после строки PPVCount. Пример:

PPVCountAtInception

ОператорCountGreaterThanPPVCountIndicator

ЦЕЛЬ: Моя цель — сделать так, чтобы код возвращал только переменную PPVCount. Я также хочу сохранить столбцы: Pattern, LineNumber, Line. Простите за незнание и заранее спасибо

$file = 'C:\\Users\\B187515\\Downloads\\j.json'
$PPVCount = "PPVCount"

Get-Content $file | Select-String -Pattern $PPVCount -Context 1| Select-Object Pattern,LineNumber, Line -ExpandProperty Context -First 18 | Format-Table | Out-file -FilePath 'C:\\Users\\B187515\\Downloads\\test.csv' -Append

Ожидаемые результаты:

Моя цель состоит в том, чтобы код возвращал только переменную «PPVCount» в файле CSV. Я также хочу сохранить столбцы: Pattern, LineNumber, Line.

Фактические результаты Есть несколько возвращаемых переменных, которые содержат «PPVCount» где-то в имени переменной. См. скриншот CSV введите сюда описание изображения

удалите Format-Table и замените Out-File на Export-Csv

Santiago Squarzon 01.08.2024 04:22

Итак, выкройка, которую вы ищете, "PPVCount":

Mathias R. Jessen 01.08.2024 10:55

-Шаблон использует регулярное выражение. Чтобы получить только строку, начинающуюся с PPVCount, используйте «^PPVCount» или только содержащую, используйте «^PPVCount$».

jdweng 01.08.2024 11:35

В качестве отступления: несмотря на то, что пути к файлам безопасны, нет смысла использовать \\ вместо \ в PowerShell. \ не является escape-символом. в PowerShell есть `.

mklement0 01.08.2024 12:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Опираясь на полезные комментарии:

# Note: Just use '\' - no need for '\\'
$file = 'C:\Users\B187515\\Downloads\j.json'

# Enclose the property name to search for in embedded "..."
$searchRegex ='"PPVCount"'

# Pass $file (the file to search through) directly to Select-String, 
# and use Export-Csv to export the results to a CSV file.
Select-String -LiteralPath $file -Pattern $searchRegex -Context 1 | 
  Select-Object Pattern, LineNumber, Line -ExpandProperty Context -First 18 | 
  Export-Csv -LiteralPath 'C:\Users\B187515\Downloads\test.csv'
  • Ваше намерение — искать строку PPVCount как отдельное слово; поскольку вы, похоже, ищете эту строку как имя свойства JSON, вы можете предположить, что она заключена в встроенный "..." и, следовательно, может сделать ее частью строки поиска.

    • Поскольку это эквивалентно буквальному поиску, вы можете добавить переключатель -SimpleMatch, что, вероятно, повысит производительность.

    • Как правило, чтобы найти токен, состоящий только из букв, цифр или _ как отдельное слово, вы можете использовать утверждения границ слов, также известные как якорь (который является функцией регулярного выражения и поэтому требует от вас не использовать -SimpleMatch ), поэтому альтернативой в вашем случае будет использование $searchRegex ='\bPPVCount\b'

  • Поскольку вы намерены создать файл CSV, используйте Export-Csv для его создания.

    • Что касается того, что вы использовали: оба Format-Table и Out-File создают представления данных для человека-наблюдателя, поэтому никогда не следует использовать их для печати данных для программной обработки - см. этот ответ для получения дополнительной информации.

    • Предостережение относительно кодировки символов: в Windows PowerShell (версии до версии 5.1) Export-Csv по необъяснимым причинам по умолчанию используется кодировка ASCII(!); тогда как в PowerShell (Core) 7 это похвально UTF-8 без спецификации. При необходимости используйте аргумент -Encoding, но учтите, что -Encoding utf8 всегда создает файл UTF-8 со спецификацией в Windows PowerShell.

  • Пара отступлений:

    • Хотя это и безопасно для путей к файлам, нет смысла использовать \\ вместо \ в PowerShell. \ не является escape-символом. в PowerShell ` есть — см. раздел справки about_Special_Characters.

    • В приведенном выше примере путь к файлу для поиска передается непосредственно в Select-String через его параметр -LiteralPath. Это гораздо эффективнее, чем передавать в него строки файла одну за другой через Get-Content, и требуется, если вы хотите видеть номера строк рядом с совпадающими строками в выводе дисплея по умолчанию.

Спасибо всем за ваши ответы. Я использовал $searchRegex ='"PPVCount"', удалил \\, но сохранил таблицу форматирования и выходной файл, поскольку визуально проверяю результаты.

Big Smooth 01.08.2024 21:59

Рад слышать, что это помогло, @BigSmooth. Если вы придерживаетесь Out-File, я предлагаю не использовать расширение имени файла .csv. Также обратите внимание, что вы можете помочь будущим читателям, четко обозначив, какой ответ, если таковой имеется, решил вашу проблему, а именно приняв его.

mklement0 01.08.2024 22:51

Другие вопросы по теме