ما هو أمر Linux Shell الذي يُرجع جزءًا من السلسلة؟[ينسخ]
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- استخراج السلسلة الفرعية في باش 20 إجابة
أريد العثور على أمر Linux يمكنه إرجاع جزء من السلسلة.في معظم لغات البرمجة، هو substr()
وظيفة.هل لدى bash أي أمر يمكن استخدامه لهذا الغرض.أريد أن أكون قادرًا على فعل شيء كهذا..substr "abcdefg" 2 3
- المطبوعات cde
.
سؤال مشابه بعد:
المحلول
إذا كنت تبحث عن أداة مساعدة لـ Shell للقيام بشيء كهذا، فيمكنك استخدام cut
يأمر.
لأخذ مثالك، حاول:
echo "abcdefg" | cut -c3-5
الذي يحصد
cde
أين -cN-M
يخبر أمر القطع بإرجاع الأعمدة N
ل M
, ، شامل.
نصائح أخرى
من صفحة باش:
${parameter:offset}
${parameter:offset:length}
Substring Expansion. Expands to up to length characters of
parameter starting at the character specified by offset.
[...]
أو، إذا لم تكن متأكدا من وجود bash
, ، فكر في استخدام cut
.
في bash "الخالص"، لديك العديد من الأدوات لمعالجة السلسلة (الفرعية)، بشكل أساسي، ولكن ليس حصريًا توسيع المعلمة :
${parameter//substring/replacement}
${parameter##remove_matching_prefix}
${parameter%%remove_matching_suffix}
توسيع السلسلة الفرعية المفهرسة (سلوكيات خاصة ذات إزاحات سلبية، وفي الأطوال السالبة في الأطوال السالبة):
${parameter:offset}
${parameter:offset:length}
${parameter:offset:length}
وبالطبع التوسعات المفيدة جدًا التي تعمل على تحديد ما إذا كانت المعلمة فارغة:
${parameter:+use this if param is NOT null}
${parameter:-use this if param is null}
${parameter:=use this and assign to param if param is null}
${parameter:?show this error if param is null}
لديهم سلوكيات قابلة للتعديل أكثر من تلك المذكورة، وكما قلت، هناك طرق أخرى للتعامل مع السلاسل (الطريقة الشائعة هي $(command substitution)
مع sed أو أي مرشح خارجي آخر).ولكن، يمكن العثور عليها بسهولة عن طريق الكتابة man bash
أنني لا أشعر أنه من المفيد تمديد هذا المنشور.
في باش يمكنك تجربة هذا:
stringZ=abcABC123ABCabc
# 0123456789.....
# 0-based indexing.
echo ${stringZ:0:2} # prints ab
المزيد من العينات في مشروع توثيق لينكس
expr(1)
لديه أمر فرعي substr:
expr substr <string> <start-index> <length>
قد يكون هذا مفيدًا إذا لم يكن لديك bash (ربما Linux مضمن) ولا تريد عملية "الصدى" الإضافية التي تحتاجها لاستخدام القطع (1).
${string:position:length}