برای جستجو کردن و جایگزین کردن کلمهای خاص در یک فایل متنی میتوانید از نرمافزارهای سادهای مثل Notepad ویندوز یا نرمافزارهای حرفهایتر مثل Notepad++ استفاده کنید اما اگر بخواهید کلمهای را در تعدادی فایل متنی در یک مرحله پیدا کرده و جایگزین کنید، نرمافزارهای زیادی در لیست انتخاب شما باقی نمیمانند. اما با ترفندی ساده و نوشتن یک فایل اسکرپیت ساده میتوانید در یک مرحله Search و Replace کردن عبارتی را در تعداد زیادی فایل متنی انجام بدهید.
در ادامه با روش جایگزین کردن کلمه یا عبارت دلخواه در تعدادی فایل متنی به صورت دستهجمعی آشنا میشویم. با ما باشید.
فایلهای متنی ساده کاربردهای بسیار متنوعی دارند. از فایلهای گزارش یا Log و زیرنویسهایی با فرمت SRT گرفته تا فایلهای اسکریپت PowerShell ویندوز و بسیاری دیگر، همگی ساختار متن ساده دارند. ممکن است پسوند این نوع فایلها TXT نباشد اما باز کردن چنین فایلهایی در نرمافزاری ساده مثل Notepad ویندوز امکانپذیر است و با همین روش میتوانید فایل را ویرایش کرده و ذخیره کنید.
جایگزین کردن عبارت در فایل متنی توسط Notepad ویندوز
در نرمافزار نوتپد اگر کلید میانبر Ctrl + H را فشار بدهید، پنجرهی Replace که به معنی جایگزین کردن است، باز میشود. اکنون میتوانید در فیلد اول عبارت موردنظر را تایپ کنید و در دومین فیلد، عبارت جدید را تایپ کنید. با کلیک روی دکمهی Replace All تمام موارد در متن پیدا شده و جایگزین میشود.
در نهایت میتوانید فایل را با نام جدیدی ذخیره کنید.
جایگزین کردن عبارت در فایلهای متنی مختلف به صورت گروهی
اما اگر بخواهید کلمه یا جملهای را در تعداد زیادی فایل مختلف پیدا کرده و به جای آن از عبارت دیگری استفاده کنید، چه باید کرد؟
برای این کار میتوانید از یک اسکریپت ساده استفاده کنید که تمام فایلهای متنی داخل یک فولدر را بررسی کرده و عبارتی را پیدا میکند و به جای آن عبارت جدید را قرار میدهد. برای ساخت اسکریپت، نرمافزار نوتپد ویندوز را اجرا کنید و متن زیر را در آن کپی و پیست کنید:
Get-ChildItem 'Path-to-files\*.txt' -Recurse | ForEach { (Get-Content $_ | ForEach { $_ -replace 'Original-Word', 'New-Word' }) | Set-Content $_ }
اکنون بخشهایی از دستورات فوق را تغییر بدهید تا عبارت موردنظر شما را جایگزین کند:
- به جای Path-to-files مسیر فولدر موردنظر را وارد کنید. به عنوان مثال اگر فایلهای متنی شما در درایو D و فولدر text قرار گرفته است، آدرس را D:\text وارد کنید.
- به جای txt از پسوند فایلهای موردنظر استفاده کنید. به عنوان مثال برای ویرایش کردن فایلهایی با پسوند xml از همین عبارت به جای txt استفاده کنید.
- به جای Original-Word عبارت موردنظر را قرار بدهید.
- به جای New-Word از عبارت جدید استفاده کنید.
بنابراین برای پیدا کردن کلمهی Post در تمام فایلهای متنی که پسوندشان txt است و در فولدر text و در پارتیشن D قرار دارند و استفاده از کلمهی Article به جای آن، دستورات فوق به این صورت تغییر میکند:
Get-ChildItem 'D:\text\*.txt' -Recurse | ForEach { (Get-Content $_ | ForEach { $_ -replace 'Post', 'Article' }) | Set-Content $_ }
در نهایت به مرحلهی ذخیره کردن اسکریپت میرسیم. کلید میانبر Ctrl + S را فشار دهید تا پنجرهی Save باز شود. از منوی کرکرهای انتخاب فرمت، حالت All Files را انتخاب کنید و در فیلد File name از نام دلخواه و پسوند ps1 استفاده کنید.
برای اجرا کردن اسکریپتهای پاورشل ویندوز، روی فایل اسکریپت راستکلیک کرده و گزینهی Run with PowerShell را انتخاب کنید.
و اما چند نکته در مورد زبان فارسی و همینطور شکستن کلمات:
دقت کنید که حین ذخیره کردن فایل اسکریپت، اگر کلمهی موردنظر شما فارسی باشد و به جای آن بخواهید از عبارت فارسی دیگری استفاده کنید، میتوانید نوع ایندینگ را روی حالت Unicode قرار دهید اما حالت ANSI نیز کم و بیش مناسب است.
نکتهی دیگر این است که این اسکریپت میتواند کلمات را بشکند و بخشهای از کلمات کامل را جایگزین کند! به عنوان مثال اگر از اسکریپت زیر استفاده کنید، به جای عبارت پستها، عبارت مطالبها قرار میگیرد! به همین ترتیب اگر به جای the حرف a جایگزین شود، کلمهی these به معنی اینها به کلمهی عجیب ase تبدیل میشود!
Get-ChildItem 'D:\text\*.txt' -Recurse | ForEach { (Get-Content $_ | ForEach { $_ -replace 'پست', 'مطالب' }) | Set-Content $_ }
برای حل کردن مشکل شکسته شدن کلمات، میتوانید به جای سرچ کردن کلمهی پست، عبارت " پست " را جستوجو کرده و به جای آن عبارت جدید را قرار دهید. به عبارت دیگر اسپیس یا فاصله قبل و بعد از کلمهی موردنظر را اضافه کنید تا کلمهی دیگری که پست در میان آن است، شکسته نشود. دقت کنید که در عبارت جایگزین هم اسپیس ابتدا و انتها را اضافه کنید.
بنابراین برای جایگزین کردن the با a میتوانید از دستور زیر استفاده کنید:
Get-ChildItem 'D:\text\*.txt' -Recurse | ForEach { (Get-Content $_ | ForEach { $_ -replace ' the ', ' a ' }) | Set-Content $_ }