Как найти в файле сложную строку, содержащую символы, которые нужно экранировать в параметре поиска / замены - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы найти эту точную строку (кавычки, скобки, амперсанды и все) в файле, но, по-видимому, мне не удалось правильно экранировать строку, чтобы я мог найти совпадение:

this._name='Search',this._url='https://www.google.com/search?q={keywords}&client=firefox&ie=utf-8&oe=utf-8',"

Мои попытки на данный момент включают:

Select-String -Path "C:\textfile.txt" -Pattern 'this._name=''Search'',this._url=''https://www.google.com/search?q={keywords}&client=firefox&ie=utf-8&oe=utf-8'',"'
Select-String -Path "C:\textfile.txt" -Pattern "this._name='Search',this._url='https://www.google.com/search?q={{keywords{{&client=firefox&ie=utf-8&oe=utf-8',`""

и некоторые его варианты (включая экранирование косой черты с помощью обратной косой черты), ни один из которых не дает совпадения. (Это простой текстовый файл, созданный в блокноте, который содержит только первую строку выше, скопируйте и вставьте, чтобы быть уверенным).

Я также пробовал

$stuff = Get-Content -Path 'C:\textfile.txt'
$newstuff = $stuff -replace '[String above in various escape variations]'

(который я может захотеть использовать в конце концов), чтобы увидеть, будет ли он вести себя по-другому, но не повезло.

Кроме того, ручное форматирование / экранирование строк, подобных этим, занимает очень много времени (и, очевидно, подвержено ошибкам). Есть ли команда или инструмент, который можно использовать для быстрого создания полностью экранированных строк для использования со строками в одинарных и / или двойных кавычках в PowerShell?

Я благодарен за любую помощь. Спасибо.

1 Ответ

1 голос
/ 04 августа 2020

Во-первых, вы должны экранировать специальные символы регулярных выражений ., ? и {. Метод класса Regex Escape() может сделать это за вас. Во-вторых, вам нужно правильно обрабатывать внутренние кавычки. Любые внутренние кавычки, которые могут преждевременно закрыть внешние кавычки, должны быть экранированы. Вы можете просто удвоить эти кавычки для побега.

$pattern = [regex]::Escape('this._name=''Search'',this._url=''https://www.google.com/search?q={keywords}&client=firefox&ie=utf-8&oe=utf-8'',"')
Select-String -Path C:\textfile.txt -Pattern $pattern
...