كيف يمكنني قص (1) كلمات الجمل؟
-
03-07-2019 - |
سؤال
هل هناك طريقة سهلة في باش لتقسيم الكلمة الجملية إلى الكلمات المكونة لها؟
على سبيل المثال، أريد تقسيم 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[@]}'"