پس از جستجو و فیلتر کردن دادهها، مرحلهی بعدی معمولاً تبدیل و تغییر آنهاست. ابزارهای sed و tr دو ابزار قدرتمند برای تغییر محتوای متنی در خط فرمان هستند. sed یک ویرایشگر جریانی (Stream Editor) همهکاره است و tr یک ابزار ساده و تخصصی برای ترجمه یا حذف کاراکترها.
sed (Stream Editor)
دستور sed مخفف Stream Editor است و همانطور که از نامش پیداست، یک ویرایشگر متنی است که بر روی جریان داده (Stream) کار میکند. به عبارت دیگر، sed میتواند متن ورودی را خط به خط بخواند، تغییرات مورد نظر را اعمال کند و خروجی را نمایش دهد. این ابزار فوقالعاده قدرتمند است و اغلب در اسکریپتها برای جایگزینی، حذف، درج و ویرایش متن بهکار میرود.
ساختار کلی:
sed [options] 'command' [file...]
نحوهی کار sed
sed ورودی خود (از فایل یا stdin) را خط به خط پردازش میکند. برای هر خط، دستورات مشخصشده را اعمال میکند و در صورت عدم استفاده از گزینهی -i، نتیجه را در خروجی استاندارد (stdout) نمایش میدهد. فایل اصلی تغییر نمیکند مگر اینکه از گزینهی -i (in-place) استفاده کنید.
دستورات اصلی sed
۱. جایگزینی (Substitution) با s
پرکاربردترین دستور sed، دستور s (مخفف Substitute) برای جایگزینی یک الگو با متن دیگر است.
ساختار:
sed 's/pattern/replacement/'
-
pattern: الگوی مورد نظر برای جستجو (میتواند Regex باشد). -
replacement: متنی که جایگزین میشود. -
/: جداکننده (Delimiter). میتوان از هر کاراکتر دیگری مانند#یا|نیز استفاده کرد، بهویژه زمانی که الگو یا جایگزین شامل/باشد.
پرچمهای جایگزینی:
| پرچم | توضیح | مثال |
|---|---|---|
g | همهی موارد مطابق در هر خط را جایگزین کن (Global). | sed 's/foo/bar/g' |
1 | فقط اولین مورد در هر خط را جایگزین کن (پیشفرض). | sed 's/foo/bar/1' |
2 | فقط دومین مورد را جایگزین کن. | sed 's/foo/bar/2' |
i | جستجوی بدون حساسیت به بزرگ/کوچکی. | sed 's/foo/bar/i' |
w | نتیجه را در یک فایل بنویس. | sed 's/foo/bar/w output.txt' |
p | خطوطی که تغییر کردهاند را چاپ کن (معمولاً با -n). | sed -n 's/foo/bar/p' |
مثالها:
-
جایگزینی اولین مورد در هر خط (پیشفرض):
echo "foo bar foo" | sed 's/foo/FOO/' # خروجی: FOO bar foo
-
جایگزینی همهی موارد در هر خط:
echo "foo bar foo" | sed 's/foo/FOO/g' # خروجی: FOO bar FOO
-
جایگزینی در یک فایل (و نمایش نتیجه در ترمینال):
sed 's/color/colour/g' file.txt
این دستور فایل را تغییر نمیدهد، فقط نتیجهی تغییرات را نمایش میدهد.
-
جایگزینی مستقیم در فایل (با گزینه
-i):sed -i 's/color/colour/g' file.txt
فایل
file.txtرا مستقیماً تغییر میدهد (تغییرات دائمی). -
ایجاد بکاپ قبل از تغییر (با
-i.bak):sed -i.bak 's/color/colour/g' file.txt
ابتدا یک کپی از فایل اصلی با پسوند
.bakایجاد میکند و سپس تغییرات را اعمال میکند. -
استفاده از جداکنندهی دیگر برای خوانایی بهتر:
echo "/home/user" | sed 's#/home/#/root/#' # خروجی: /root/user
استفاده از
#بهجای/باعث میشود که نیازی به Escape کردن/در مسیر نباشد.
۲. حذف خطوط با d
دستور d (مخفف Delete) برای حذف خطوطی که با یک الگو مطابقت دارند یا در یک محدودهی مشخص هستند، استفاده میشود.
ساختار:
sed '/pattern/d'
مثالها:
-
حذف خطوط خالی:
sed '/^$/d' file.txt
تمام خطوط خالی را حذف میکند.
-
حذف خطوط حاوی یک کلمهی خاص:
sed '/#/d' config.conf
خطوطی که شامل
#هستند (معمولاً کامنتها) را حذف میکند. -
حذف خطوطی که با یک الگو شروع میشوند:
sed '/^[0-9]/d' file.txt
خطوطی که با اعداد شروع میشوند را حذف میکند.
-
حذف محدودهای از خطوط:
sed '5,10d' file.txt
خطوط ۵ تا ۱۰ را حذف میکند.
-
حذف از یک الگو تا انتهای فایل:
sed '/START/,/$/d' file.txt
از اولین خط حاوی
STARTتا انتهای فایل را حذف میکند.
۳. چاپ خطوط با p
دستور p (مخفف Print) برای چاپ خطوط خاص استفاده میشود. معمولاً با گزینهی -n (خاموش کردن چاپ پیشفرض) همراه میشود تا فقط خطوط مورد نظر نمایش داده شوند.
ساختار:
sed -n '/pattern/p'
مثالها:
-
چاپ خطوط حاوی یک کلمه:
sed -n '/error/p' log.txt
فقط خطوط حاوی
errorرا نمایش میدهد (مشابهgrep error log.txt). -
چاپ خطوط در یک محدوده:
sed -n '10,20p' file.txt
خطوط ۱۰ تا ۲۰ را نمایش میدهد.
۴. اضافه کردن متن با a و i
-
a(append): متن را بعد از یک خط یا الگو اضافه میکند. -
i(insert): متن را قبل از یک خط یا الگو اضافه میکند.
ساختار:
sed '/pattern/a\new line' sed '/pattern/i\new line'
مثالها:
-
اضافه کردن یک خط بعد از خط حاوی
START:sed '/START/a\--- New line inserted ---' file.txt
-
اضافه کردن یک خط قبل از خط حاوی
END:sed '/END/i\--- Inserted before END ---' file.txt
گزینههای پیشرفتهی sed
| گزینه | توضیح | مثال |
|---|---|---|
-n | چاپ پیشفرض را غیرفعال میکند (فقط با p چاپ میکند). | sed -n 's/foo/bar/p' |
-i | تغییرات را مستقیماً در فایل اعمال میکند (In-place). | sed -i 's/foo/bar/g' file |
-i.bak | تغییرات را اعمال کرده و یک بکاپ با پسوند .bak ایجاد میکند. | sed -i.bak 's/foo/bar/g' file |
-e | اجرای چندین دستور. | sed -e 's/foo/bar/' -e 's/baz/qux/' |
-f | اجرای دستورات از یک فایل اسکریپت. | sed -f script.sed file |
مثالهای پیشرفته
-
چندین جایگزینی با
-e:sed -e 's/foo/FOO/g' -e 's/bar/BAR/g' file.txt
-
جایگزینی با گروههای Regex (با استفاده از
\1,\2):echo "John Doe" | sed 's/\([A-Z][a-z]*\) \([A-Z][a-z]*\)/\2, \1/' # خروجی: Doe, John
-
جایگزینی با استفاده از Extended Regex (با
-E):echo "John Doe" | sed -E 's/([A-Z][a-z]*) ([A-Z][a-z]*)/\2, \1/' # خروجی: Doe, John
-
تبدیل حروف کوچک به بزرگ (با
\Uو\L):echo "hello world" | sed 's/.*/\U&/' # خروجی: HELLO WORLD echo "HELLO WORLD" | sed 's/.*/\L&/' # خروجی: hello world
-
حذف فضای خالی اضافی در ابتدا و انتهای خط:
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt
-
جایگزینی یک الگو در خطوط خاص (خطوطی که با
#شروع نمیشوند):sed '/^#/! s/foo/bar/g' config.conf
در تمام خطوطی که با
#شروع نمیشوند،fooرا باbarجایگزین کن.
tr (Translate)
دستور tr مخفف Translate است و یک ابزار ساده و بسیار سریع برای ترجمه (جایگزینی)، حذف یا فشردهسازی کاراکترها در یک جریان متنی است. برخلاف sed که با الگوها و خطوط کار میکند، tr فقط بر روی کاراکترهای منفرد عمل میکند و از Regex پشتیبانی نمیکند.
ساختار کلی:
tr [options] set1 [set2]
-
set1: مجموعهی کاراکترهای ورودی که باید تغییر کنند. -
set2: مجموعهی کاراکترهای خروجی (در صورت وجود).
حالتهای اصلی tr
۱. ترجمه (Translation)
هر کاراکتر از set1 با کاراکتر متناظر در set2 جایگزین میشود. طول set1 و set2 باید برابر باشد.
مثالها:
-
تبدیل حروف کوچک به بزرگ:
echo "hello" | tr 'a-z' 'A-Z' # خروجی: HELLO
-
تبدیل حروف بزرگ به کوچک:
echo "HELLO" | tr 'A-Z' 'a-z' # خروجی: hello
-
تبدیل کاراکترهای خاص:
echo "hello:world" | tr ':' ' ' # خروجی: hello world
-
ترجمه با محدودهها:
echo "abc123" | tr 'a-zA-Z' 'A-Za-z' # خروجی: ABC123 (حروف کوچک به بزرگ تبدیل میشوند، اعداد تغییری نمیکنند)
۲. حذف کاراکترها (با -d)
گزینهی -d (Delete) کاراکترهای مشخصشده در set1 را از ورودی حذف میکند.
مثالها:
-
حذف تمام اعداد:
echo "hello123world" | tr -d '0-9' # خروجی: helloworld
-
حذف فاصلهها:
echo "hello world" | tr -d ' ' # خروجی: helloworld
-
حذف کاراکترهای خاص:
echo "hello@world!" | tr -d '@!' # خروجی: helloworld
-
حذف همهی کاراکترهای غیرعددی (برای استخراج اعداد):
echo "Price: $123.45" | tr -d 'a-zA-Z$' # خروجی: 123.45
۳. فشردهسازی کاراکترها (با -s)
گزینهی -s (Squeeze) کاراکترهای تکراری را فشرده میکند و آنها را به یک کاراکتر تبدیل میکند.
مثالها:
-
فشردهسازی چند فاصله پشت سر هم به یک فاصله:
echo "hello world" | tr -s ' ' # خروجی: hello world
-
فشردهسازی خطوط خالی تکراری:
echo -e "line1\n\n\nline2" | tr -s '\n' # خروجی: # line1 # line2
-
فشردهسازی و ترجمهی همزمان:
echo "hello world" | tr -s ' ' '_' # خروجی: hello_world (فاصلهها با '_' جایگزین شده و فشرده شدهاند)
۴. مکمل (Complement) با -c
گزینهی -c (Complement) به جای کاراکترهای set1، همهی کاراکترهای دیگر را انتخاب میکند.
مثالها:
-
حذف همهی کاراکترها به جز حروف کوچک:
echo "Hello123" | tr -cd 'a-z' # خروجی: ello
-
استخراج فقط اعداد از یک رشته:
echo "abc123xyz" | tr -cd '0-9' # خروجی: 123
-
استخراج فقط حروف (و حذف بقیه):
echo "Hello World!" | tr -cd 'a-zA-Z' # خروجی: HelloWorld
مقایسهی sed و tr
| ویژگی | sed | tr |
|---|---|---|
| واحد پردازش | خط (Line) | کاراکتر (Character) |
| پشتیبانی از Regex | بله (قدرتمند) | خیر |
| جایگزینی | بله (با الگوهای پیچیده) | بله (فقط کاراکتر به کاراکتر) |
| حذف | بله (خطوط یا بخشهایی از خط) | بله (کاراکترها) |
| فشردهسازی | خیر (میتوان با Regex شبیهسازی کرد) | بله (-s) |
| تغییر فایل مستقیم | بله (-i) | خیر (فقط خروجی استاندارد) |
| سرعت | کندتر (پیچیدهتر) | بسیار سریع (سادهتر) |
| کاربرد اصلی | جایگزینی پیچیده، ویرایش متن | تبدیل کاراکترها، پاکسازی داده |
چه زمانی از چه ابزاری استفاده کنیم؟
-
از
sedاستفاده کنید زمانی که:-
نیاز به جایگزینی بر اساس الگوهای Regex دارید.
-
نیاز به عملیات روی خطوط کامل دارید (مانند حذف، چاپ، کپی).
-
نیاز به تغییر مستقیم فایل (
-i) دارید. -
نیاز به انجام عملیات پیچیدهی متنی (چندین دستور) دارید.
-
-
از
trاستفاده کنید زمانی که:-
فقط نیاز به ترجمهی کاراکترها (مثلاً تغییر حالت حروف) دارید.
-
نیاز به حذف سریع برخی کاراکترها دارید.
-
نیاز به فشردهسازی کاراکترهای تکراری دارید.
-
سرعت برایتان مهم است (پردازش حجم عظیم داده).
-
مثالهای ترکیبی (با Pipe)
-
تمیز کردن یک فایل CSV و تبدیل به حروف کوچک:
cat data.csv | tr -d '\r' | tr 'A-Z' 'a-z'
-
استخراج کلمات از یک متن (حذف علائم نگارشی و تبدیل به کوچک):
echo "Hello, World!" | tr -d '[:punct:]' | tr 'A-Z' 'a-z' # خروجی: hello world
-
پیدا کردن تعداد کلمات منحصربهفرد در یک فایل:
tr -cs 'a-zA-Z' '\n' < file.txt | sort | uniq -c
-
تبدیل فاصلهها و تبهای تکراری به یک کاراکتر (برای پردازش CSV):
cat messy.txt | tr -s ' \t' ','
جمعبندی نهایی
sed و tr هر دو ابزارهای حیاتی در جعبهابزار هر کاربر خط فرمان هستند. sed برای تغییرات پیچیدهتر و الگومحور و tr برای تبدیلهای سریع و سادهی کاراکتری عالی است. تسلط بر هر دوی این ابزارها، شما را در پردازش و تبدیل متنها در لینوکس به یک حرفهای تبدیل میکند.