روابط سريعة
النقاط الرئيسية
يقوم الأمر tr بإجراء عمليات تحويل على مجرى نص، مما ينتج مجرى نص جديد كمخرج له. يمكنك استبدال أو حذف أو تحويل الأحرف وفقًا للقواعد التي تحددها على سطر الأوامر.
هل تحتاج إلى طريقة بسيطة للتعامل مع سلسلة من النصوص في Linux؟ لا تبحث أبعد من الأمر tr، الذي يمكنه توفير الوقت في استبدال النص المدخل وإزالته ودمجه وضغطه. وهذه هي الطريقة التي يتم بها ذلك.
ما هو الأمر tr؟
لينكس tr
الأمر هو أداة سريعة وبسيطة لإزالة الأحرف غير المرغوب فيها من تدفقات النص، ولإجراء حيل معالجة أخرى أنيقة. ويشتق اسمه من كلمة “ترجمة”، tr
تمتد جذور ‘s عميقًا في تقاليد يونكس.
كما نعلم جميعًا، فإن Linux هو إعادة كتابة مفتوحة المصدر لنظام التشغيل Unix. وهو يضيف أيضًا أشياء خاصة به إلى المزيج. إنه ليس نسخة طبق الأصل من بايت مقابل بايت، ولكنه يأخذ بوضوح الكثير من مبادئ التصميم والتوجيه الهندسي من نظام التشغيل Unix.
على الرغم من أنه تم اعتماد توزيعتين فقط من Linux حتى الآن كـ بوسيكس متوافقة ومختومة رسميًا باعتبارها مقبولة باعتبارها تنفيذات لنظام التشغيل Unix—أويلر أو إس و إنسبور كيه-يو إكس—لقد حل لينكس محل يونكس بشكل كامل تقريبًا في عالم الأعمال.
تلتزم جميع توزيعات لينكس، على الأقل في أدواتها الأساسية، بفلسفة يونكس. فلسفة يونكس يجسد الرؤية كان رواد يونكس يتطلعون إلى نظام التشغيل الجديد الخاص بهم. وغالبًا ما يتم إعادة صياغة هذا الأمر على النحو التالي: “كتابة برامج تقوم بعمل شيء واحد بشكل جيد”. ولكن الأمر أكثر من ذلك.
كان أحد أكثر الابتكارات قوة هو أن البرامج يجب أن تولد مخرجات يمكن استخدامها كمدخلات لبرامج أخرى. إن القدرة على ربط أدوات سطر الأوامر معًا، باستخدام تدفق المخرجات من برنامج واحد كمدخلات للبرنامج التالي في السطر، أمر قوي للغاية.
في بعض الأحيان قد ترغب في ضبط أو تعديل الناتج من أحد البرامج قبل أن يصل إلى البرنامج التالي في السطر. أو ربما لا تأخذ المدخلات من أداة سطر أوامر Linux، بل تقوم ببث نص من ملف لم يتم إنشاؤه مع مراعاة احتياجاتك الخاصة.
هذا هو المكان tr
يأتي إلى حد ذاته. فهو يسمح لك بإجراء مجموعة من التحويلات البسيطة على مجرى الإدخال الخاص به، لإنتاج مجرى الإخراج الخاص به. ويمكن إعادة توجيه مجرى الإخراج هذا إلى ملف، أو إدخاله في برنامج Linux آخر، أو حتى في مثيل آخر من tr
لتطبيق تحويلات متعددة على الدفق.
استبدال الشخصيات
ال tr
يعمل الأمر على مجرى الإدخال الخاص به وفقًا للقواعد. عند استخدامه بدون أي خيارات لسطر الأوامر، يكون الإجراء الافتراضي هو tr
هو استبدال الأحرف في مجرى الإدخال بأحرف أخرى.
أوامر إلى tr
تتطلب عادةً مجموعتين من الأحرف. تحتوي المجموعة الأولى على الأحرف التي سيتم استبدالها إذا تم العثور عليها في مجرى الإدخال. تحتوي المجموعة الثانية على الأحرف التي سيتم استبدالها بها.
الطريقة التي يعمل بها هذا هي أن تكرار الحرف الأول في المجموعة الأولى سيتم استبداله بالحرف الأول في المجموعة الثانية. تكرار الحرف الثاني في المجموعة الأولى سيتم استبداله بالحرف الثاني في المجموعة الثانية، وهكذا.
سيبحث هذا المثال عن الحرف “c” في مجرى الإدخال tr
، واستبدل كل تكرار بالحرف “z”. لاحظ أن tr
حساسة لحالة الأحرف.
نحن نستخدم
echo
لدفع بعض النص إلى tr
.
echo abcdefabc | tr 'c' 'z'
يتم استبدال جميع تكرارات “c” بـ “z” ويتم كتابة السلسلة الجديدة في نافذة المحطة الطرفية.
هذه المرة سنبحث عن حرفين، “a” و”c”. لاحظ أننا لا نبحث عن “ac”. نحن نبحث عن “a”، ثم نبحث عن “c”. سنستبدل أي ظهور لـ “a” بـ “x” وأي ظهور لـ “c” بـ “z”.
echo abcdefabc | tr 'ac' 'xz'
لكي ينجح هذا، يجب أن يكون لديك نفس عدد الأحرف في كلتا المجموعتين. إذا لم يكن الأمر كذلك، فستحصل على سلوك متوقع، ولكن ربما غير مرغوب فيه.
echo 'call me Ishmael.' | tr 'abcdjklm' '123'
يوجد عدد أكبر من الأحرف في المجموعة الأولى مقارنة بالمجموعة الثانية. لا يوجد حرف مماثل للحروف “d” إلى “m” في المجموعة الثانية. سيتم استبدالها، ولكن سيتم استبدالها جميعًا بالحرف الأخير في المجموعة الثانية.
من الممكن أن يكون هذا مفيدًا في بعض الحالات، ولكن إذا كنت تريد منع ذلك، فيمكنك استخدام -t
خيار (الحذف). يستبدل هذا الخيار فقط تلك الأحرف الموجودة في المجموعة الأولى والتي تحتوي على حرف مطابق في المجموعة الثانية.
echo 'call me Ishmael.' | tr -t 'abcdjklm' '123'
استخدام النطاقات والرموز
يمكن أن تحتوي المجموعة الأولى والمجموعة الثانية على نطاقات من الأحرف. على سبيل المثال، (a-z)
يمثل جميع الحروف الصغيرة، و (A-Z)
يمثل جميع الأحرف الكبيرة. يمكننا الاستفادة من ذلك لتغيير حالة سلسلة من النصوص.
سيؤدي هذا إلى تحويل مجرى الإدخال إلى أحرف كبيرة.
echo "How-To Geek" | tr '(a-z)' '(A-Z)'
لقلب الحالة في الاتجاه الآخر، يمكننا استخدام نفس الأمر ولكن مع تبديل نطاقات الأحرف الكبيرة والصغيرة على سطر الأوامر.
echo "How-To Geek" | tr '(A-Z)' '(a-z)'
هناك رموز يمكننا استخدامها لبعض الحالات الشائعة التي قد نرغب في مطابقتها.
- (:النوم:):الحروف والأرقام.
- (:ألفا:):الحروف فقط.
- (:رقم:):أرقام فقط.
- (:فارغ:):علامات التبويب والمسافات.
- (:فضاء:):جميع المسافات البيضاء، بما في ذلك أحرف السطر الجديد.
- (:الرسم البياني:):جميع الأحرف بما في ذلك الرموز، ولكن ليس المسافات.
- (:مطبعة:):جميع الأحرف بما في ذلك الرموز، بما في ذلك المسافات.
- (:نقطة:):جميع علامات الترقيم.
- (:أدنى:):الأحرف الصغيرة.
- (:أعلى:):الأحرف الكبيرة.
يمكننا إجراء التحويلات من الأحرف الصغيرة إلى الأحرف الكبيرة ومن الأحرف الكبيرة إلى الأحرف الصغيرة بنفس السهولة، باستخدام الرموز.
echo "How-To Geek" | tr '(:lower:)' '(:upper:)'
echo "How-To Geek" | tr '(:upper:)' '(:lower:)'
قلب المباريات
ال -c
يتطابق خيار (المكمل) مع جميع الأحرف باستثناء تلك الموجودة في المجموعة الأولى. يحول هذا الأمر كل شيء باستثناء الحرف “c” إلى شرطة ” -
“.
echo abcdefc | tr -c 'c' '-'
يضيف هذا الأمر الحرف “a” إلى المجموعة الأولى. يتم تحويل أي شيء بخلاف “a” أو “c” إلى علامة ناقص ” -
” شخصية.
echo abcdefc | tr -c 'ac' '-'
حذف وضغط الأحرف
يمكننا أن نستخدم tr
إزالة الأحرف بالكامل، دون أي استبدال.
يستخدم هذا الأمر -d
(حذف) خيار لإزالة أي ظهور لـ “a”، أو “d”، أو “f” من مجرى الإدخال.
echo abcdefc | tr -d 'adf'
هذه حالة واحدة حيث لدينا مجموعة واحدة فقط من الأحرف على سطر الأوامر، وليس مجموعتين.
والأمر الآخر هو عندما نستخدم -s
خيار (التكرار بالضغط). يقلل هذا الخيار من تكرار الأحرف إلى حرف واحد فقط.
سيؤدي هذا المثال إلى تقليل التسلسلات المتكررة لحرف المسافة إلى مسافة واحدة.
echo "a b c de f c" | tr -s '(:blank:)'
إنه أمر مربك بعض الشيء أن (:blank:)
يمثل الرمز حرف المسافة، و (:space:)
يمثل الرمز جميع أشكال المسافات البيضاء، بما في ذلك علامات التبويب وأحرف السطر الجديد.
في هذه الحالة، يمكننا استبدال (:blank:)
مع (:space:)
والحصول على نفس النتيجة.
echo "a b c de f c" | tr -s '(:space:)'
حذف الأحرف
الاختلافات بين (:blank:)
و (:space:)
تصبح واضحة عندما نحذف الأحرف. للقيام بذلك، نستخدم -d
خيار (حذف)، وتوفير مجموعة من الأحرف التي tr
سوف يبحث عنها في مجرى الإدخال الخاص به. وسوف يقوم بإزالة أي شيء يجده.
echo "a b c de f c" | tr -d '(:blank:)'
يتم حذف المسافات. لاحظ أننا نحصل على سطر جديد بعد كتابة مجرى الإخراج في نافذة المحطة الطرفية. إذا كررنا هذا الأمر واستخدمنا (:space:)
بدلاً من الفراغ، سنحصل على نتيجة مختلفة.
echo "a b c de f c" | tr -d '(:blank:)'
هذه المرة لا نبدأ سطرًا جديدًا بعد الإخراج، بل يتم توجيه موجه الأوامر مباشرة إليه. وذلك لأن (:space:)
يتضمن أسطرًا جديدة. تتم إزالة أي مسافات وعلامات تبويب وأحرف سطر جديد من مجرى الإدخال.
بالطبع، يمكنك استخدام حرف الفضاء الفعلي أيضًا.
echo "a b c de f c" | tr -d ' '
يمكننا بسهولة حذف الأرقام.
echo abcd123efg | tr -d '(:digit:)'
من خلال الجمع بين -c
(مكمل) و -d
(الحذف) الخيار الذي يمكننا من خلاله حذف كل شيء باستثناء الأرقام.
echo abcd123efg | tr -cd '(:digit:)'
لاحظ أن كل شيء ما عدا الأرقام يعني كل الحروف وكل المسافات البيضاء، لذلك نفقد مرة أخرى سطر النهاية الجديد.
دمج وتقسيم الخطوط
إذا استبدلنا أحرف السطر الجديد بالمسافات، فيمكننا تقسيم سطر من النص ووضع كل كلمة في سطر منفصل.
echo 'one two three four' | tr ' ' '\n'
يمكننا أيضًا تغيير الفاصل الذي يفصل بين الكلمات. يستبدل هذا الأمر الفاصلة بعلامتي النقطتين ” :
“للمساحات.”
echo 'one two three four' | tr ' ' ':'
يمكننا العثور على أي فاصل قيد الاستخدام، واستبداله بأحرف السطر الجديد، وتقسيم النص الصعب قراءته إلى نص أسهل في الإدارة.
متغير بيئة المسار عبارة عن سلسلة طويلة من العديد من مسارات الدليل. :
“يفصل كل مسار. سنقوم بتغييرها إلى أحرف سطر جديد.
echo $PATH
echo $PATH | tr ":" "\n"
وهذا أسهل بكثير للتحليل بصريًا.
إذا كان لدينا إخراج نريد إعادة تنسيقه إلى سطر واحد، فيمكننا القيام بذلك أيضًا. يحتوي الملف “lines.txt” على بعض النصوص، مع كلمة واحدة في كل سطر. سنقوم بإدخال ذلك في tr
وتحويله إلى سطر واحد.
cat files.txt
cat lines.txt | tr '\n' ' '
استخدام tr مع الأنابيب
يمكننا استخدام الناتج من tr
كمدخل لبرنامج آخر، أو حتى لـ tr
نفسها.
يستخدم هذا الأمر tr
أربع مرات.
- الأول
tr
يحذف أي علامات الوصل “-” من المدخلات. - الثاني
tr
يقوم بدمج أي مسافات متكررة في مسافات مفردة. - الثالث
tr
يستبدل المسافات بأحرف السفليّة “_”. - الرابع والأخير
tr
يحول السلسلة إلى أحرف صغيرة.
echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '(:upper:)' '(:lower:)'
البساطة هي البساطة
ال tr
إن الأمر عظيم لأنه بسيط. ليس هناك الكثير لنتعلمه أو نتذكره. لكن بساطته قد تكون سبباً في سقوطه أيضاً.
لا تخطئ، ستجد في كثير من الأحيان أن tr
يتيح لك القيام بما تحتاج إليه دون الحاجة إلى اللجوء إلى أدوات أكثر تعقيدًا مثل sed
.
ومع ذلك، إذا كنت تواجه صعوبة في القيام بشيء ما tr
وإذا وجدت نفسك تقوم ببناء سلاسل طويلة من الأوامر، فربما يجب عليك استخدام sed
.