বাশ - নতুন লাইনের সাথে স্থানটি প্রতিস্থাপন করুন


70

আমি কীভাবে ইনপুটটিতে নতুন লাইনের সাথে স্পেসগুলি প্রতিস্থাপন করতে পারি:

/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5 ইত্যাদি ...

নিম্নলিখিত পেতে:

/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5

বিঃদ্রঃ

আমি অন্যান্য ব্যবহারকারীদের সহায়তা করার জন্য এই প্রশ্নটি পোস্ট করছি, যতক্ষণ না আমি এই প্রশ্নটি টাইপ না করা শুরু করি ততক্ষণ ইউনিক্স এসই-তে একটি দরকারী উত্তর খুঁজে পাওয়া সহজ ছিল না। এর পরে আমি নিম্নলিখিতগুলি পেয়েছি:

সম্পর্কিত প্রশ্ন

আমি কীভাবে একটি নতুন লাইনের সাথে সন্ধান এবং প্রতিস্থাপন করতে পারি?



ls / পাথ / থেকে / | xargs প্রতিধ্বনি | সেড 's / \ s \ + / \ n / জি'
এসডি।

উত্তর:


125

trকমান্ডটি ব্যবহার করুন

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5"\
| tr " " "\n"

Http://www.unix.com/shell-programming-scriptting/67831-replace-space-new-line.html এ পাওয়া গেছে


1
টিআর পাশাপাশি আমার প্রথম চিন্তা ছিল, যদিও এটি করার অনেকগুলি উপায় রয়েছে! trযদিও এটি ঠিক তেমন কি , তবে কি!
রব

5
+1, তবে একটি মন্তব্য হিসাবে: ফাইলের
নামগুলিতে

20

এই ক্ষেত্রে আমি প্রিন্টফ ব্যবহার করব:

printf '%s\n' /path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5

যদি শূণ্যস্থান আছে মধ্যে পাথ এক, আপনি অনুক্রমে এটা শূণ্যস্থান উপর বিভক্ত হওয়া থেকে রোধ করার জন্য যে filepath উদ্ধৃত করতে পারেন:

printf '%s\n' /path/to/file '/path/to/file with spaces' /path/to/another/file

সাধারণভাবে পাঠ্যকে রূপান্তরিত করা, trআপনার বিদ্যমান বাউসের মতো উত্তম বাজি।


1
ভবিষ্যতের একটি দ্রুত নোট: এই সমাধান পোস্ট করার জন্য ধন্যবাদ, "প্রতিধ্বনি" ব্যবহারের তুলনায় এটি আমার পক্ষে খুব নির্ভরযোগ্য।
লাইসমিথ

5

ধরে নিচ্ছি আপনার বিভাজক হিসাবে স্পেসগুলির সাথে একটি স্ট্রিং রয়েছে:

newline_separated=${space_separated// /$'\n'}

তবে আপনি সম্ভবত ভুল প্রশ্ন জিজ্ঞাসা করছেন। (অগত্যা নয়, উদাহরণস্বরূপ এটি একটি মেকফিলের মধ্যে উপস্থিত হতে পারে)) ফাইলের নামের একটি পৃথক পৃথকীকরণের তালিকাটি আসলেই কাজ করে না: যদি ফাইলের নামের কোনওটিতে ফাঁকা স্থান থাকে?

যদি কোনও প্রোগ্রাম আর্গুমেন্ট হিসাবে ফাইলের নামগুলি গ্রহণ করে তবে স্পেসে তাদের সাথে যোগদান করবেন না। ব্যবহার করুন "$@"এক তাদের এক অ্যাক্সেস করতে। যদিও echo "$@"এর মধ্যে ফাঁক দিয়ে আর্গুমেন্টগুলি মুদ্রণ করে, কারণ এটি echo: এটি পৃথক পৃথক হিসাবে স্পেস দিয়ে তার যুক্তিগুলি মুদ্রণ করে। somecommand "$@"কমান্ডের পৃথক যুক্তি হিসাবে ফাইলের নামগুলি পাস করে। আপনি যদি পৃথক লাইনে যুক্তিগুলি মুদ্রণ করতে চান তবে আপনি ব্যবহার করতে পারেন

printf '%s\n' "$@"

যদি আপনার কাছে স্পেস-বিভাজিত ফাইলের নাম থাকে এবং এগুলি কাজ করার জন্য আপনি এগুলিতে একটি অ্যারে রাখতে চান তবে আপনি অক্ষরগুলিতে মানটি বিভক্ত করতে একটি অব্যক্ত ভেরিয়েবল প্রসারণ ব্যবহার করতে পারেন IFS( set -fঅন্যথায় গ্লোব সহ আপনার ওয়াইল্ডকার্ড সম্প্রসারণ অক্ষম করতে হবে) নিদর্শনগুলিতে প্রসারিত হবে):

space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do 

আপনি এটিকে কোনও ফাংশনে আবদ্ধ করতে পারেন যা সেটি -fহয়ে IFSগেলে এবং এর মানটি পুনরুদ্ধার করে :

split_list () {
  local IFS=' ' flags='+f'
  if [[ $- = *f* ]]; then flags=; fi
  set -f
  eval "$1=($2)"
  set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do 

এটির সঠিক উত্তর পরিবর্তন করা। আমি মনে করি যে আমি কীভাবে একটি স্থান-বিচ্ছিন্ন তালিকায় এসেছি এবং গবেষণাটি আরও সঠিকভাবে আবিষ্কার করব। আপনার মত স্নিপনেটকে যদি আপনি কিছুটা মন্তব্য করেন, স্থানীয় ভেরি আইএফএস বা শর্ত $ - = f এর মতো জিনিসগুলি কী করে তা আমাদের জানান, তবে আমার মতো শিক্ষার্থীদের জন্য এটি দুর্দান্ত । এমন ব্যক্তি যে ব্যক্তি কয়েকবার ব্যাশ ব্যবহার করে তা জানে না।
laconbass

@ ল্যাকনবাস আমি একটি সংক্ষিপ্ত ব্যাখ্যা যুক্ত করেছি। দেখুন set -fএবং IFSব্যাশ ম্যানুয়াল আপনি সব বিস্তারিত চান। এছাড়াও দেখুন unix.stackexchange.com/questions/16192/…
গিলস

@ গুইলস এই সংক্ষিপ্ত ব্যাখ্যাটি আমার পক্ষে যথেষ্ট এবং আমি মনে করি এটি অন্য অনেকের পক্ষে হবে। আপনার সময়ের জন্য টাই
লকনবাস

IFSস্থানীয়ভাবে সেটিং কার্যকর হয় না
এলিরান মালকা

@ ইলিরানমালকা এই বিষয়টির দ্বারা আপনি কী বোঝাতে চেয়েছেন তা আমার কোনও ধারণা নেই। যদি কোনও স্ক্রিপ্ট আপনার ভাবার মতো আচরণ করে না, আপনি এখানে একটি প্রশ্ন জিজ্ঞাসা করতে পারেন।
গিলস

4

ব্যবহারিক হয়ে উঠুন, ব্যবহার করুন !!

sed 's/\s\+/\n/g' file

উপরেরটি এক বা একাধিক শ্বেত স্পেস অক্ষর (+ গুলি +) কে নিউলাইন () n) এর সাথে প্রতিস্থাপন করতে বলেছে

এটি কমবেশি:

'substitute /one space or more/ for /newline/ globally'

1
বিকল্পের সাথে পরিবর্তন প্রতিস্থাপন করুন, এটাই আসলে এর জন্য দাঁড়িয়েছে!
রব

@ রব ধন্যবাদ, মনে রাখবেন আপনি অন্যের উত্তর সম্পাদনা করতে পারেন।
এমজিপি

1
আপনার যদি পাঠ্যের মধ্যে একাধিক স্পেস থাকে তবে আপনি ফাঁকা লাইন পাবেন। আপনি ঠিক একটি জায়গার জন্য অন্তত একটি স্পেস প্রয়োগ হিসাবে কমপক্ষে একটি স্পেস মেলাতে চান তা বোঝাতে আপনাকে + s এর পরে '+' যুক্ত করতে হবে। অর্থাত। সেড 's / \ s + / \ n / g'
ডার্কহার্ট

4

tr@ ল্যাকনবাস থেকে বিকল্প হিসাবে xargsআপনি এই ক্ষেত্রেও ব্যবহার করতে পারেন :

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4  /path/to/file5"\
| xargs -n1

সুবিধাটি হ'ল এটি একাধিক হোয়াইটস্পেসের সাথেও কাজ trকরে , যা না।


0

আমি এটি কীভাবে করেছি তা এখানে:

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5" | sed 's/ /\
'/g

sedকমান্ডটিতে ব্যাকস্ল্যাশ-এর ​​পরে এন্টার কী ব্যবহারের বিষয়টি লক্ষ্য করুন ।


কোন অ্যাঙ্গম এবং কনস sedশেষ হয়েছে tr?
laconbass

আপনার আরামের স্তর :-) আমি মনে করি sedএটি কেবল সম্পাদক হিসাবে অক্ষরের অনুবাদ না করে আপনি আরও কিছু করতে পারবেন ।
আনংসট

4
sedআরও অনেক কিছু করতে পারে তবে এটির জন্য সম্পূর্ণ ওভারকিল। trএই কাজের জন্য সঠিক সরঞ্জাম, তবে জ্ঞান sedএবং রেজিক্সগুলি অবশ্যই পরে কাজে আসবে!
রব

0

লাইন ধরে ধরে অন্য একটি পদ্ধতির নামটি পরিবর্তনশীল হিসাবে রয়েছে line:

for path in $line;do echo $path;done

এটি এই সত্যটি ব্যবহার করে যে বাশ তার আর্গুমেন্টগুলি ডিফল্টরূপে হোয়াইট স্পেসে বিভক্ত করে এবং এটি ডিফল্টরূপে echoতার ইনপুটটিতে একটি নতুন লাইন যুক্ত করে।


আমি এই প্রশ্নটি পোস্ট করার আগে এবং এটি কাজ করতে না পারার আগে আমি আমার উবুন্টু সিস্টেমে এটি চেষ্টা করেছি।
laconbass

0
echo word1 word2 ... | sed -e 'y/ /\n/;P;D'

একক স্পেস-বিভাজিত শব্দের নতুন লাইনে পৃথক করাতে অন্য পদ্ধতি।


-1

নিম্নলিখিত স্ক্রিপ্টটি বোঝা সহজ এবং সহজেই ব্যবহারযোগ্য।

cat filename | tr ' ' '\n' | tee filename

2
আপনার উত্তরের সারমর্মটি ( tr) স্বীকৃত উত্তরের মতোই। আপনার উত্তরে নিম্নলিখিত বিষয়গুলি রয়েছে এর পাশাপাশি: ক) কমান্ডটি 4 টি স্পেস দিয়ে ইন্ডেন্ট করা হয়নি (-> মার্কডাউন লেআউট) খ) আপনার ব্যবহার catঅকেজো (আপনি এটির সাথে প্রতিস্থাপন করতে পারেন < filename tr ' ' '\n')। গ) আপনার আউটপুট ফাইলের নাম ইনপুট ফাইলের নামের মতো। এটির সাথে আপনি একটি ডেটা রেস তৈরি করেন।
ম্যাক্সচলেপজিগ

1
ম্যাক্সচ্লেপজিগের সঠিক বিশ্লেষণ বাদে, এটি কোনও স্ক্রিপ্ট নয়, তবে সংযুক্ত কমান্ডগুলির একটি গোছা যা হার্ডকোডযুক্ত একটি নাম রয়েছে (যেমন স্ক্রিপ্টটিতে শিরোনামটি নির্দিষ্ট করার জন্য শেলটি নির্দিষ্ট করতে এবং আউটপুট নির্দিষ্ট করার জন্য দুটি পরামিতি ব্যবহার করার জন্য একটি শিরোনাম থাকবে)। এ ছাড়া আমার বাড়ির 3 জনের মধ্যে 2 জনের পক্ষে এটি বোঝা সহজ হয় না। হতে পারে এটি প্রতিনিধিত্বমূলক নয়, তবে মনে রাখবেন যে আপনি নিজেরাই বুঝে এমন কিছু (বা এই ক্ষেত্রে আপনি বুঝতে পেরেছেন) সর্বদা সহজ বলে মনে হয়।
অ্যান্থন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.