Yoqimli qo'shimchani, shuningdek, oldingi yo'lni oldindan olib tashlash

Shakli filepatlarim bor:

../healthy_data/F35_HC_532d.dat

Buning uchun F35_HC_532d ni chiqarishni istayman. Beshdagi ushbu fayl nomidan oldingi va qo'shimcha nomlarni olib tashlashim mumkin:

for i in ../healthy_data/*; do echo ${i#../healthy_data/}; done # REMOVES PREFIX

for i in ../healthy_data/*; do echo ${i%.dat}; done # REMOVES SUFFIX

Qanday qilib ularni birlashtira olaman, shuning uchun bitta buyruq bilan ikkalasini ham olib tashlayman va istagan qismini chiqaramanmi?

1
@ hek2mgl: Ha!
qo'shib qo'ydi muallif Peaceful, manba
@ hek2mgl: Ha!
qo'shib qo'ydi muallif Peaceful, manba
Faqatgina mavzu emas, lekin zsh bu kodni beradi: echo $ i: t: r .
qo'shib qo'ydi muallif chepner, manba
Faqatgina mavzu emas, lekin zsh bu kodni beradi: echo $ i: t: r .
qo'shib qo'ydi muallif chepner, manba
Barcha fayllar .dat bilan tugatilsinmi?
qo'shib qo'ydi muallif hek2mgl, manba
OK, keyin javobimni tekshiring
qo'shib qo'ydi muallif hek2mgl, manba
OK, keyin javobimni tekshiring
qo'shib qo'ydi muallif hek2mgl, manba

6 javoblar

Buning uchun BASH regex-dan foydalanishingiz mumkin va bosib chiqarilgan guruh # 1:

for file in ../healthy_data/*; do
    [[ $file =~ .*/([_[:alnum:]]+)\.dat$ ]] && echo "${BASH_REMATCH[1]}"
done
5
qo'shib qo'ydi
@anubhava: Ushbu yondashuvni o'rganganimdan so'ng, aslida uni dastlab qabul qilganimdan foydalanaman. Biroq, qabul qilingan javobni o'zgartirish uchun endi juda nochor ko'rinadi.
qo'shib qo'ydi muallif Peaceful, manba
@AkshayHegde: Ha, bu yaxshi yondashuv. Biroq, bu savol regexdan foydalanish haqida emas, balki ikkita alohida narsani birlashtirish haqida edi. Qabul qilingan javobning oxirgi qismi aynan shunday qiladi.
qo'shib qo'ydi muallif Peaceful, manba
Ha. Buni men yodda tutdim. Vaqtingiz uchun rahmat.
qo'shib qo'ydi muallif Peaceful, manba
Bu tez! Menga javob sifatida yozgan narsangizning ma'nosini tushunish uchun menga biror marta murojaat qila olasizmi?
qo'shib qo'ydi muallif Peaceful, manba
qo'shib qo'ydi muallif anubhava, manba
Yo'q, hatto qabul qilingan javob oxirgi qismda 2 bosqichda amalga oshiriladi, chunki bu 2 direktivni bir-biriga bash bilan birlashtirish mumkin emas. Regex faqatgina oddiy bir qadamda sof bash yordamida foydalanishingiz mumkin.
qo'shib qo'ydi muallif anubhava, manba
Kelishdi. Men faqat bir necha texnik haqiqatni aytib o'tgan edim, hatto mening do'stim @Inianning belgisini olishni istamasdim
qo'shib qo'ydi muallif anubhava, manba
^ 1 Buni qabul qilish kerak, yaxshi yondashuv.
qo'shib qo'ydi muallif Akshay Hegde, manba

Buning uchun BASH regex-dan foydalanishingiz mumkin va bosib chiqarilgan guruh # 1:

for file in ../healthy_data/*; do
    [[ $file =~ .*/([_[:alnum:]]+)\.dat$ ]] && echo "${BASH_REMATCH[1]}"
done
5
qo'shib qo'ydi
Ha. Buni men yodda tutdim. Vaqtingiz uchun rahmat.
qo'shib qo'ydi muallif Peaceful, manba
@anubhava: Ushbu yondashuvni o'rganganimdan so'ng, aslida uni dastlab qabul qilganimdan foydalanaman. Biroq, qabul qilingan javobni o'zgartirish uchun endi juda nochor ko'rinadi.
qo'shib qo'ydi muallif Peaceful, manba
@AkshayHegde: Ha, bu yaxshi yondashuv. Biroq, bu savol regexdan foydalanish haqida emas, balki ikkita alohida narsani birlashtirish haqida edi. Qabul qilingan javobning oxirgi qismi aynan shunday qiladi.
qo'shib qo'ydi muallif Peaceful, manba
Bu tez! Menga javob sifatida yozgan narsangizning ma'nosini tushunish uchun menga biror marta murojaat qila olasizmi?
qo'shib qo'ydi muallif Peaceful, manba
qo'shib qo'ydi muallif anubhava, manba
Yo'q, hatto qabul qilingan javob oxirgi qismda 2 bosqichda amalga oshiriladi, chunki bu 2 direktivni bir-biriga bash bilan birlashtirish mumkin emas. Regex faqatgina oddiy bir qadamda sof bash yordamida foydalanishingiz mumkin.
qo'shib qo'ydi muallif anubhava, manba
Kelishdi. Men faqat bir necha texnik haqiqatni aytib o'tgan edim, hatto mening do'stim @Inianning belgisini olishni istamasdim
qo'shib qo'ydi muallif anubhava, manba
^ 1 Buni qabul qilish kerak, yaxshi yondashuv.
qo'shib qo'ydi muallif Akshay Hegde, manba

Awk dan foydalanishingiz mumkin bo'lsa, juda oddiy,

for i in ../healthy_data/*
do 
    stringNeeded=$(awk -F/ '{split($NF,temp,"."); print temp[1]}' <<<"$i")
    printf "%s\n" "$stringNeeded"
done

-F/ kodi / belgisi bo'yicha kirish satrini ajratadi va $ NF dot oldidan qismini chiqarib olish uchun split() funktsiyasi bilan ishlay boshlaydi. dot .

Yuqorida keltirilgan Awk da variantlar/funktsiyalar POSIX mos keladi.


Bundan tashqari, bash ichki o'tgan parametr kengayishlarini qo'llab-quvvatlamaydi, siz quyidagi ikki bosqichda o'zgartirishingiz kerak: -

tempString="${i#*/*/}"
echo "${tempString%.dat}"

Bitta burchakda,

for i in ../healthy_data/*; do tempString="${i#*/*/}"; echo "${tempString%.dat}" ; done 

The two fold syntax here, "${i#*/*/}" part just stores the F35_HC_532d.dat into the variable tempString and in that variable we are removing the .dat part as "${tempString%.dat}"

1
qo'shib qo'ydi
Oxirgi buyruq men istagan narsadir.
qo'shib qo'ydi muallif Peaceful, manba
Javobingiz uchun tashakkur. Biroq mening savolim - Awk kabi boshqa narsalarni ishlatish o'rniga Bashdagi ikkita buyruqni qanday qilib birlashtirishim mumkin. Har qanday fikr bormi?
qo'shib qo'ydi muallif Peaceful, manba
Ha. Lekin tempString% .dat o'rniga i% .dat yozgansiz.
qo'shib qo'ydi muallif Peaceful, manba
@Peaceful: Tinchlik :) uni o'zgartirdi
qo'shib qo'ydi muallif Inian, manba
@Peaceful: Aytganimdek, bu xuddi shunday yo'lni topishning yana bir usuli. Eslab qoling, Awk deyarli asosiy Linux/Unix platformalarida o'rnatiladi, shuning uchun siz bunday ahamiyatsiz ish uchun foydalanishingiz mumkin.
qo'shib qo'ydi muallif Inian, manba

Agar barcha fayllar .dat bilan tugagan bo'lsa (tasdiqlaganingizda) basename buyrug'ini ishlatishingiz mumkin:

basename -s .dat /path/to/files/*

Ushbu fayllarning ko'p (!) bo'lsa, argument ro'yxati juda uzun xatolikka yo'l qo'ymaslik uchun find ni ishlating.

find /path/to/files -maxdepth 1 -name '*.dat' -exec basename -s .dat {} +

.dat fayllarining har qanday miqdori ikkinchi buyruqdan foydalansangiz, uni bajarish kerak bo'lgan shell scripti uchun!

0
qo'shib qo'ydi

Buni bir qadam deb hisoblaysizmi?

for i in ../healthy_data/*; do 
   sed 's#\.[^.]*##'<<< "${i##*/}"
done
0
qo'shib qo'ydi

Bir parametrni kengaytirishda ham old qo'shimchani, ham qo'shimchani qo'shib bo'lmaydi.

Biroq, bu faqat bitta parametrlarni kengaytirish operatsiyalaridan foydalangan holda amalga oshirilishi mumkin. Faqat oldindan ajratilgan kengaytmani o'zgaruvchiga saqlab qo'ying va uning kengaytmasini olib tashlash uchun yana kengaytirishni qo'llang:

for file in ../healthy_data/*; do
    prefix_stripped="${file##*\/healthy_data\/}"
    echo "${prefix_stripped%.dat}"
done
0
qo'shib qo'ydi