قراءة وتحديث FileStream
-
19-08-2019 - |
سؤال
لدي أداة صغيرة تقوم بالبحث عن عدد من الملفات. اضطررت إلى إنشائها لأن عمليات البحث عن سطح المكتب من Google & Windows لم تجد الخطوط المناسبة في الملفات. يعمل البحث بشكل جيد (أنا على استعداد لتحسينه) ولكن أحد الأشياء التي أود إضافتها إلى استخدامي هو اكتشاف/استبدال الدُفعات.
فكيف سيكون أفضل طريقة لقراءة سطر من ملف ، ومقارنته بمصطلح البحث ، وإذا تم مروره ، ثم قم بتحديث السطر ، واستمر من خلال بقية الملف؟
المحلول
سأفعل ما يلي لكل ملف:
- قم بالبحث كالمعتاد. تحقق أيضًا من الرمز المميز ليحل محله. بمجرد رؤيته ، ابدأ هذا الملف مرة أخرى. إذا لم تر الرمز المميز ليحل محله ، فأنت تنتهي.
- عندما تبدأ من جديد ، قم بإنشاء ملف جديد ونسخ كل سطر تقرأه من ملف الإدخال ، وقم بإجراء الاستبدال أثناء الذهاب.
- عندما تنتهي بالملف:
- انقل الملف الحالي إلى اسم ملف النسخ الاحتياطي
- انقل الملف الجديد إلى اسم الملف الأصلي
- حذف ملف النسخ الاحتياطي
كن حذرًا من أنك لا تفعل ذلك على الملفات الثنائية وما إلى ذلك - عادة ما تكون عواقب إجراء البحث النصفي والاستبدال على الملفات الثنائية أمرًا مريحًا!
نصائح أخرى
إذا كان PowerShell خيارًا ، فيمكن استخدام الوظيفة المحددة أدناه لإجراء البحث والاستبدال عبر الملفات. على سبيل المثال ، للعثور على 'a string'
في الملفات النصية في الدليل الحالي ، ستفعل:
dir *.txt | FindReplace 'a string'
ليحل محل 'a string'
بقيمة أخرى ، فقط أضف القيمة الجديدة في النهاية:
dir *.txt | FindReplace 'a string' 'replacement string'
يمكنك أيضًا الاتصال به على ملف واحد باستخدام FindReplace -path MyFile.txt 'a string'
.
function FindReplace( [string]$search, [string]$replace, [string[]]$path ) {
# Include paths from pipeline input.
$path += @($input)
# Find all matches in the specified files.
$matches = Select-String -path $path -pattern $search -simpleMatch
# If replacement value was given, perform replacements.
if( $replace ) {
# Group matches by file path.
$matches | group -property Path | % {
$content = Get-Content $_.Name
# Replace all matching lines in current file.
foreach( $match in $_.Group ) {
$index = $match.LineNumber - 1
$line = $content[$index]
$updatedLine = $line -replace $search,$replace
$content[$index] = $updatedLine
# Update match with new line value.
$match | Add-Member NoteProperty UpdatedLine $updatedLine
}
# Update file content.
Set-Content $_.Name $content
}
}
# Return matches.
$matches
}
لاحظ أن Select-String
يدعم أيضًا مباريات Regex ، ولكن تم تقييد المباريات البسيطة للبساطة ؛) يمكنك أيضًا إجراء بديل أكثر قوة مثل جون اقترح ، بدلاً من مجرد كتابة الملف بالمحتوى الجديد.