تمام سوالات سوالات بدون پاسخ سوال بپرسید

تعداد زیادی فایل در شاخه های تو در تو دارم که بصورت متنی هستند. می خواهم رشته ای را در تمام این فایل ها با رشته ای دیگر جایگزین کنم. آیا ممکن است که این کار را بدون برنامه سازی و تنها با استفاده از bash script انجام دهم. بدیهی است که در linux می خواهم این کار را انجام دهم.

2 پاسخ

میتونید از این دستور استفاده کنید:

find . -type f -print0 | xargs -0 sed -i 's/old_pattern/new_pattern/g'

که در این دستور عبارت «.» اشاره دارد به مسیر جاری و «old-pattern» الگوی مورد جستجو است و «new-pattern» متن جایگزین است.

توضیحات بیشتر:
این دستور بدین معناست که در مسیر جاری بدنبال فایلها میگردد (-type f) نتایج رو با یک کاراکتر تهی (null) از هم جدا میکند (-print0) و بازای هر کدام از این فایل ها (xargs) دستور sed را اجرا میکند. اما تغییرات را پس از اعمال در همان فایل ذخیره میکند (-i).
سوئیچ -0 به دستور xargs اعلام میکنه که عناصر لیست پارامترهای ورودی، با null از هم جدا شده اند. یعنی کاراکتر تهی جدا کننده نام فایلهاست.


برای این کار می تونید از این قطعه کد ساده استفاده کنید:

#!/bin/bash
OLD="oldstring"
NEW="newstring"
DPATH="path/to/dir"
TFILE="/tmp/out.tmp.$$"

function myreplace {

if [ -f $1 -a -r $1 ]; then
  sed "s/\b$2\b/$3/I" "$1" > $4 && mv $4 $1
else
  echo "Error: Cannot read $1"
fi

}

export -f myreplace
find $DPATH -type f -exec bash -c "myreplace {} $OLD $NEW $TFILE" \;

این کار مشکلی رو به همراه داره... روش ذکر شده، یک فایل موقت درست میکنه و نتیجه رو توش میذاره و بعد فایل موقت رو جایگزین فایل اصلی میکنه. این کار باعث میشه که دسترسی های فایل اصلی دستکاری بشه.

(29 مه '12, 02:32) _Ant Eater_
toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها