سؤال

لدي أداة صغيرة تقوم بالبحث عن عدد من الملفات. اضطررت إلى إنشائها لأن عمليات البحث عن سطح المكتب من 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 ، ولكن تم تقييد المباريات البسيطة للبساطة ؛) يمكنك أيضًا إجراء بديل أكثر قوة مثل جون اقترح ، بدلاً من مجرد كتابة الملف بالمحتوى الجديد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top