একটি সীমানার উপর দীর্ঘ লাইন বিভক্ত


21

এইভাবে ইনপুট বিভক্ত করতে আমি কোন আদেশটি ব্যবহার করতে পারি:

foo:bar:baz:quux

এই মধ্যে?

foo
bar
baz
quux

আমি cutকমান্ডটি বের করার চেষ্টা করছি তবে মনে হচ্ছে এটি কেবলমাত্র "প্রথম 1000 অক্ষর" বা "প্রথম 7 ক্ষেত্র" এর মতো নির্দিষ্ট পরিমাণ ইনপুট দিয়ে কাজ করবে। আমাকে নির্বিচারে দীর্ঘ ইনপুট নিয়ে কাজ করা দরকার।


5
আপনি মানে tr : '\n' < input?
jw013

আপনি কোন শেল ব্যবহার করছেন? ব্যাশ?
glenn jackman

উত্তর:


34

কয়েকটি অপশন আছে:

  • tr : \\n
  • sed 's/:/\n/g'
  • awk '{ gsub(":", "\n") } 1'

আপনি খাঁটিভাবে এটি করতে পারেন bash:

while IFS=: read -ra line; do
    printf '%s\n' "${line[@]}"
done

3
মনে রাখবেন যে \nপ্রতিস্থাপনের স্ট্রিংটি ব্যবহার করে এটি জিএনইউ সেডে কাজ করবে তবে অন্যান্য বেশিরভাগ এসড বাস্তবায়নে ব্যর্থ হবে।
wjv

@ ক্রিসডাউন এআইএক্স-তে প্রথম দুটি কাজ করার কোনও উপায় আছে কি?
কোকডুড


4

যদি আপনার গ্রেপ সমর্থন করে তবে -oআপনি এটি এইভাবে করতে পারেন:

grep -o '[^:]\+'

বা জোর দিয়ে, রেকর্ড বিভাজকটি সেট করে ::

awk -v RS=: 1

বা জিএনইউ কাটা সহ:

cut -d: --output-delimiter=$'\n' -f1-

সম্পাদন করা

নীচে ক্রিস দ্বারা উল্লিখিত হিসাবে, এটি একটি ট্রেলিং করা নতুন লাইন ছেড়ে যাবে, যদি আপনার অ্যাজক RSনিয়মিত এক্সপ্রেশন (জিএনইউ অ্যাওক দিয়ে পরীক্ষিত) হিসাবে উল্লেখ করা সমর্থন করে তবে এড়ানো যায় :

awk -v RS='[:\n]' 1

আপনার awkউদাহরণটি (সম্ভবত অযাচিত) পেছনের নতুন লাইন ছেড়ে যাবে।
ক্রিস ডাউন

@ ক্রিসডাউন: আপনি ঠিক বলেছেন, আরএস যদি নিয়মিত প্রকাশ হতে পারে তবে এড়ানো যায় be
থোর

-1

কিছু স্ট্রিংয়ে আমার উপরের সমাধানগুলির সাথে সমস্যা ছিল। তবে এটি আমার পক্ষে কাজ করেছে:

echo $string | sed 's/\\n/ /g' | tr " " \\n

যেমন লেখা আছে, এটি ওপি উদাহরণ ইনপুটকে রূপান্তরিত করে না।
কুলগ্রিগেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.