استخدم المساحة كمحدد باستخدام أمر القطع

StackOverflow https://stackoverflow.com/questions/816820

  •  03-07-2019
  •  | 
  •  

سؤال

أريد استخدام المساحة كمحدد مع cut يأمر.

ما هو بناء الجملة الذي يمكنني استخدامه لهذا؟

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

المحلول

cut -d ' ' -f 2

وأين 2 هو رقم الحقل حقل محدد المساحة التي تريدها.

نصائح أخرى

وعادة إذا كنت تستخدم الفضاء، ومحدد، وتريد لعلاج المسافات المتعددة واحد، لأنك تحليل الإخراج من أمر مواءمة بعض الأعمدة بمسافات. (وجوجل للبحث عن أن تؤدي لي هنا)

في هذه الحالة أمر cut واحد ليست كافية، وتحتاج إلى استخدام:

tr -s ' ' | cut -d ' ' -f 2

أو

awk '{print $2}'

لاستكمال الإجابات الموجودة والمفيدة؛غيض من القبعة ل دعم كيو زي لتشجيعي على نشر إجابة منفصلة:

آليتين متميزتين تعال للعب هنا:

  • (أ) سواء cut بحد ذاتها يتطلب المحدد (المسافة، في هذه الحالة) الذي تم تمريره إلى -d خيار أن يكون أ حجة منفصلة أو ما إذا كان من المقبول إلحاقه مباشرة ل -d.

  • (ب) كيف صدَفَة بشكل عام، يتم تحليل الوسائط قبل تمريرها إلى الأمر الذي يتم استدعاؤه.

(أ) تم الرد عليه باقتباس من إرشادات POSIX للمرافق (التأكيد على الألغام)

إذا أظهر ملخص الأداة المساعدة القياسية خيارًا بـ إلزامي وسيطة الخيار [...] تطبيق مطابق يجب استخدام متفرق الحجج لهذا الخيار وحجة الخيار الخاصة به. لكن, ، يجب تنفيذ المطابقة أيضًا السماح للتطبيقات بتحديد الخيار ووسيطة الخيار في نفس سلسلة الوسيطة دون أحرف متداخلة.

بعبارة أخرى:في هذه الحالة، لأن -dحجة الخيار هي إلزامي, أنت تستطيع يختار ما إذا كان سيتم تحديد المحدد كـ:

  • (ق) إما:أ متفرق دعوى
  • (د) أو:كقيمة تعلق مباشرة ل -d.

بمجرد اختيار (ق) أو (د)، يصبح صدَفَةتحليل السلسلة الحرفية - (ب) - مهم:

  • مع النهج (س), ، جميع النماذج التالية متساوية:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • مع النهج (د), ، جميع النماذج التالية متساوية:

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

وأوضح التكافؤ من قبل صدَفَةمعالجة السلسلة الحرفية:

الجميع الحلول المذكورة أعلاه تؤدي إلى نفس السلسلة بالضبط (في كل مجموعة) في الوقت المناسب cut يراهم:

  • (س): cut يرى -d, ، كما لها ملك حجة، تليها أ متفرق الوسيطة التي تحتوي على حرف مسافة - بدون علامات الاقتباس أو \ بادئة!.

  • (د): cut يرى -d زائد حرف مسافة - بدون علامات الاقتباس أو \ بادئة!- كجزء من نفس دعوى.

السبب وراء تطابق النماذج في المجموعات المعنية في النهاية هو ذو شقين، بناءً على كيف ال صدَفَة يوزع حرفية السلسلة:

  • تسمح الصدفة بتحديد الحرفي كما هي خلال آلية تسمى نقلا عن, ، والتي يمكن أن تأخذ عدة أشكال:
    • اقتباس مفرد سلاسل:محتويات داخل '...' مأخوذ حرفياً وأشكال أ أعزب دعوى
    • اقتباس مزدوج سلاسل:محتويات داخل "..." تشكل أيضا أ أعزب حجة، ولكن يخضع ل إقحام (يوسع المراجع المتغيرة مثل $var, بدائل الأوامر ($(...) أو `...`)، أو التوسعات الحسابية ($(( ... ))).
    • \-نقلا عن فردي الشخصيات\ يؤدي ظهور حرف واحد إلى تفسير هذا الحرف على أنه حرفي.
  • يتم استكمال الاقتباس بواسطة إزالة الاقتباس, ، مما يعني أنه بمجرد قيام الصدفة بتحليل سطر الأوامر، فإنه يزيل أحرف الاقتباس من الحجج (مرفقة '...' أو "..." أو \ الحالات) - وبالتالي، الأمر الذي يتم استدعاؤه لا يرى أحرف الاقتباس أبدًا.

ويمكنك أيضا أن أقول

cut -d\  -f 2

ونلاحظ أن هناك مسافتين بعد مائل.

اكتشفت للتو أن يمكنك أيضا استخدام "-d ":

cut "-d "

اختبار

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

ذنيب ذنب قصير ، وقطع تشبه فائدة (أذكى ولكن بوتيرة أبطأ I الصنع) التي يمكن استخدام أي التعابير المنطقية بيرل كعربون العاجلة. كسر في المسافات هو الافتراضي، ولكن يمكنك أيضا كسر في regexes متعددة شار، regexes البديلة، وما إلى ذلك.

scut -f='6 2 8 7' < input.file  > output.file

وهكذا الأمر أعلاه شأنه كسر الأعمدة على المسافات واستخراج (هذه البيانات تعتمد 0) العواميد 6 2 8 7 في هذا النظام.

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

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

لدي إجابة (أعترف بإجابة مربكة إلى حد ما) تتضمنsed, والتعبيرات العادية ومجموعات الالتقاط:

  • \S* - أول كلمة
  • \s* - المحدد
  • (\S*) - الكلمة الثانية - ملتقطة
  • .* - بقية السطر

ك sed التعبير، مجموعة الالتقاط تحتاج إلى الهروب، أي. \( و \).

ال \1 إرجاع نسخة من المجموعة التي تم الاستيلاء عليها، أي.الكلمة الثانية.

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

عندما تنظر إلى هذه الإجابة، تجدها مربكة إلى حد ما، وقد تفكر، لماذا تهتم؟حسنًا ، آمل أن يذهب البعض ، "آها!" وسوف تستخدم هذا النمط لحل بعض مشاكل استخراج النص المعقدة مع واحد sed تعبير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top