বাশ-এ, আমি কীভাবে কোনও ফাইলের প্রতিটি লাইনের পরে একটি স্ট্রিং যুক্ত করব?


112

ব্যাশ ব্যবহার করে কোনও ফাইলের প্রতিটি লাইনের পরে আমি কীভাবে একটি স্ট্রিং যুক্ত করব? এটি সেড কমান্ড ব্যবহার করে করা যেতে পারে, যদি তাই হয় কীভাবে?

উত্তর:


188

যদি আপনার প্যারামিটারের sedমাধ্যমে সম্পাদনা করার অনুমতি দেয় -i:

sed -e 's/$/string after each line/' -i filename

যদি তা না হয় তবে আপনাকে একটি অস্থায়ী ফাইল তৈরি করতে হবে:

typeset TMP_FILE=$( mktemp )

touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename

আপনি কেন touchঅস্থায়ী ফাইল? এবং আমি sedকমান্ডটি শর্ত সাপেক্ষে করব সাফল্যের উপর cpবা মূলটি হারাতে পারে on
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

অস্থায়ী নামটি দ্রুত সংরক্ষণ করার জন্য আমি ফাইলটি স্পর্শ করেছি। এটি প্রয়োজন হতে পারে না। আমি মনে করি আপনি সিপির সাফল্যে সিড কমান্ডকে শর্তসাপেক্ষ বানানোর বিষয়ে ঠিক বলেছেন। কেন এই সংশোধন করতে কোড সম্পাদনা করবেন না। আমি কিছু মনে করব না! ইতি, টম
টম ডিজিসি 20'10

একটি লাইনের আগে একটি স্ট্রিং যুক্ত সম্পর্কে কি ?
অক্স্বিভি

10
@ অক্সভিভি: sed -e 's/^/string after each line/' -i filename $ মানে লাইন শেষ end ^ মানে লাইনের শুরু।
টম ডিজিসি

যদি আমি সেডের মধ্যে পাইপ দিই, sed 's/^/string after each line/'যা আমি প্রত্যাশা করি তা করে (প্রতিটি লাইনে প্রিপেন্ড করে) তবে sed 's/^/string after each line/'তা না করে (এটি আমার পরিশিষ্টের স্ট্রিংয়ের সাথে পুরো লাইনটি প্রতিস্থাপন করে)। কি দেয়? @ টমডিজিসি কোন ধারণা?
ফিলাদামস

17

আমি ব্যবহার পছন্দ করা awk। যদি কেবল একটি কলাম থাকে তবে ব্যবহার করুন $0, অন্যথায় এটি শেষ কলামের সাথে প্রতিস্থাপন করুন।

একমুখী,

awk '{print $0, "string to append after each line"}' file > new_file

অথবা এটা,

awk '$0=$0"string to append after each line"' file > new_file

1
এছাড়াও, লাইন নম্বর সংযোজন করতে (যেমনটি আমার ক্ষেত্রে ছিল), কেউ NRপরিবর্তনশীল ব্যবহার করতে পারেন :awk '{print $0, NR}'
andrybak

2
@ ওপটিমাস আমি আপনার পদ্ধতিটি ব্যবহার করে দেখেছি, তবে অতিরিক্ত স্থান পাওয়ার জন্য এগুলি কীভাবে মুছে ফেলা যায়?
আদিল সাজু

@ অ্যাডিলসাজু sed 's/ //g'এটি আমার প্রয়োজনীয়তার জন্য কাজ করেছে, তবে এটি প্রতিটি লাইনে স্থান সরিয়ে ফেলবে, এক লাইনে কী gএবং সর্বত্র যে বিকল্পের বিকল্প তা প্রমাণ করবে ।
একলব্য

@ অ্যাডিলজু দয়া করে বিশদ যুক্ত করুন। একটি নতুন প্রশ্ন জিজ্ঞাসা করা ভাল।
অপ্টিমাস প্রাইম

@AdilSaju awk সরান , মত {print $0"string to append after each line"}
Culip


4
  1. খাঁটি পসিক্স শেল এবং sponge:

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file | 
    sponge file
  2. xargsএবং printf:

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
  3. ব্যবহার join:

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
  4. শেল সরঞ্জাম ব্যবহার paste, yes, head & wc:

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file

    নোট করুন যে আগে pasteএকটি ট্যাব চর সন্নিবেশ করানো হয় $suffix

অবশ্যই spongeকোনও টেম্পল ফাইলের সাথে প্রতিস্থাপন করা যেতে পারে, পরে mvমূল ফাইলের উপর দিয়ে কিছু উত্তর উত্তর হিসাবে ...


1
sedসংস্থানগুলি খুব সীমাবদ্ধ না হলে এগুলির কোনওটিই পছন্দসই নয় ।
এজিসি

আমি নন-শেড সমাধানটি পছন্দ করি। sedযেমন একটি সহজ কাজের জন্য প্রয়োজন হয় না।
ব্রুস

1

আমি পছন্দ echo। খাঁটি বাশ ব্যবহার:

cat file | while read line; do echo ${line}$string; done

-9

শেড কিছুটা কুরুচিপূর্ণ, আপনি এটিকে মার্জিতভাবে এটি করতে পারেন:

hendry@i7 tmp$ cat foo 
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar

2
শেলের সর্বাধিক আর্গুমেন্ট সীমা চেয়ে বেশি লাইনযুক্ত ফাইলগুলির জন্য ব্যর্থ। চেষ্টা করুন: বিড়াল foo | পড়ার সময় একটি; প্রতিধ্বনি করুন $ {a} বার; পরিবর্তে বা এর পরিবর্তে এরকম কিছু; এটি বেশিরভাগ ক্ষেত্রে এর জন্য উপযুক্ত প্রতিস্থাপন।
অ্যালেক্স

1
এটি তাদের ফাঁকা জায়গাগুলির লাইনে ব্যর্থ হয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
এর, না এটি ডেনিসকে ব্যর্থ করে না। শেলের সর্বোচ্চ যুক্তির সীমা? ক্রিকি আপনি দুল করছেন।
হেনড্রি

হ্যাঁ এটি করে: $ বিড়াল ফু ফু ফু বাজ অ্যালেক্স @ আর্মিটেজ: in $ আই ইন ইন cat foo; প্রতিধ্বনি করুন} {i} বার; ফুবার বারবার বাজবার করেছেন তবে কিছু পরীক্ষার পরে আমি আমার যুক্তি সম্পর্কে ভুল হতে পারি তবে ডেনিস ঠিকই বলেছেন
অ্যালেক্স

3
@ হ্যান্ড্রি হ্যাঁ, এটি তাদের স্পেসগুলির সাথে রেখাগুলির জন্য ব্যর্থ হয়, যেমন echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)ইনপুটটি 1 লাইন হওয়া সত্ত্বেও 2 টি লাইন প্রিন্ট করে foo bar(এবং catকোনও ফাইলের পরিবর্তে স্টিডিন থেকে পড়া এটির জন্য কোনও পার্থক্য রাখে না)।
হাইড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.