كيف يمكنك تحليل اسم الملف في باش ؟
سؤال
لدي اسم الملف في تنسيق مثل:
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