سؤال

لدي اسم الملف في تنسيق مثل:

system-source-yyyymmdd.dat

أود أن تكون قادرة على تحليل مختلف أجزاء من الملف باستخدام "-" كما هو محدد.

هل كانت مفيدة؟

المحلول

يمكنك استخدام الأمر قص في كل من 3 'الميادين' ، على سبيل المثال:

$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source

"د" يحدد محدد ، "- f" يحدد عدد مجال تحتاجها

نصائح أخرى

لطيفة و أنيقة (في رأيي :-) فقط باستخدام المدمج الإضافية في صفيف

var='system-source-yyyymmdd.dat'
parts=(${var//-/ })

ثم, يمكنك العثور على أجزاء في مجموعة...

echo ${parts[0]}  ==> system
echo ${parts[1]}  ==> source
echo ${parts[2]}  ==> yyyymmdd.dat

التحذير:هذا لن يعمل إذا كان اسم الملف يحتوي على "غريب" شخصيات مثل الفضاء أو السماء يحرم ، ونقلت backquotes...

اعتمادا على الاحتياجات الخاصة بك ، awk هو أكثر مرونة من قطع.أول دعابة:

# echo "system-source-yyyymmdd.dat" \
    |awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
              $1,$2,substr($3,1,4),substr($3,5,2),substr($3,7,2)}'
System: system
Source: source
Year: yyyy
Month: mm
Day: dd

المشكلة هي أن تصف awk باسم 'أكثر مرونة' هو بالتأكيد مثل الاتصال اي فون تعزيز الهاتف الخليوي ;-)

استخدام cut الأوامر.

على سبيل المثال

echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'

سيتم استخراج القطعة الأولى.

تغيير قيمة -f المعلمة للحصول على الأجزاء المناسبة.

هنا دليل على قطع الأوامر.

طريقة أخرى هي استخدام قذيفة الداخلية إعراب الأدوات التي يتجنب تكلفة إنشاء العمليات الطفل:

oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo "Source is $2"

أبسط (والمنظمة البحرية الدولية أفضل طريقة) للقيام بذلك هو ببساطة استخدام read:

$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat

هناك العديد من الاختلافات حول هذا الموضوع ، وكثير منها قذيفة تعتمد على:

bash$ IFS=-. read system source date ext <<< foo-bar-yyyymmdd.dat

echo "$name" | { IFS=-. read system source date ext
   echo In all shells, the variables are set here...; }
echo but only in some shells do they retain their value here
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top