سؤال

هل هناك طريقة سهلة في باش لتقسيم الكلمة الجملية إلى الكلمات المكونة لها؟

على سبيل المثال، أريد تقسيم aCertainCamelCasedWord إلى "كلمة معينة ذات حالة جمل" وأن أكون قادرًا على تحديد تلك الحقول التي تهمني.يتم ذلك بشكل تافه باستخدام القطع (1) عندما تكون الكلمة الفاصلة هي الشرطة السفلية، ولكن كيف يمكنني القيام بذلك عندما تكون الكلمة مكتوبة بالجمل؟

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

المحلول

وsed 's/\([A-Z]\)/ \1/g'

ويلتقط كل حرف ويستبدل المسافة البادئة مع التقاط لتيار كامل.

$ echo "aCertainCamelCasedWord" | sed 's/\([A-Z]\)/ \1/g'
a Certain Camel Cased Word

نصائح أخرى

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

$ echo 'FAQPage' | sed 's/\([A-Z]\)/ \1/g' 
F A Q Page

ولكن بدلا من ذلك مع حل بي، ستحصل على:

$ echo 'FAQPage' | sed 's/\([A-Z][^A-Z]\)/ \1/g'
FAQ Page
<اقتباس فقرة>   

ملحوظة: هذا لا يعمل بشكل صحيح عندما يكون هناك مثيل الثاني من الكلمات الكبيرة متعددة، على سبيل المثال:

$ echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two

هذه الإجابة لا يعمل بشكل صحيح عندما يكون هناك مثيل الثاني من الأحرف الكبيرة متعددة

echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two

ومطلوب جدا والإضافي التعبير عن ذلك

 echo 'FAQPageOneReplacedByFAQPageTwo' | sed -e 's|\([A-Z][^A-Z]\)| \1|g' -e 's|\([a-z]\)\([A-Z]\)|\1 \2|g'
 FAQ Page One Replaced By FAQ Page Two

باش خالص:

name="aCertainCamelCasedWord"

declare -a word                                 # the word array

counter1=0                                      # count characters
counter2=0                                      # count words

while [ $counter1 -lt ${#name} ] ; do
  nextchar=${name:${counter1}:1}
  if [[ $nextchar =~ [[:upper:]] ]] ; then
    ((counter2++))
    word[${counter2}]=$nextchar
  else
    word[${counter2}]=${word[${counter2}]}$nextchar
  fi
  ((counter1++))
done

echo -e "'${word[@]}'"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top