একাধিক পাঠ্য ফাইলের 5 ম লাইনে একটি স্ট্রিং কীভাবে প্রতিস্থাপন করবেন?


22

আমি একক টার্মিনাল কমান্ড ব্যবহার করে "গুড মর্নিং" স্ট্রিংয়ের সাথে একাধিক পাঠ্য ফাইলের (ফাইল 1.txt, file2.txt, file3.txt, file4.txt ) 5 তম লাইনটি প্রতিস্থাপন করতে চাই ।

সমস্ত পাঠ্য ফাইল আমার উপর অবস্থিত ~/Desktop

দ্রষ্টব্য: আমার ডেস্কটপটিতে 6 .txt ফাইল রয়েছে I আমি কেবল উপরের 4 টি পাঠ্য ফাইলগুলিতে পরিবর্তনটি প্রয়োগ করতে চাই।

উত্তর:


40

এখানে কয়েকটি উপায় আছে। আমি ব্রেস এক্সপেনশন ( file{1..4}.txt) এর অর্থ ব্যবহার করছিfile1.txt file2.txt file3.txt file4.txt

  1. পার্ল

    perl -i -pe 's/.*/ Good Morning / if $.==5' file{1..4}.txt

    ব্যাখ্যা:

    • -i: perlমূল ফাইল পরিবর্তন করে স্থানে ফাইলগুলি সম্পাদনা করে।

      যদি -iকোনও ফাইল এক্সটেনশন প্রত্যয় অনুসরণ করা হয় তবে প্রতিটি ফাইলের জন্য একটি ব্যাকআপ তৈরি করা হয় যা সংশোধিত হয়। উদাহরণস্বরূপ : এক্সিকিউশন চলাকালীন সংশোধিত হলে -i.bakএকটি তৈরি করেfile1.txt.bakfile1.txt

    • -p: এর অর্থ ইনপুট ফাইল লাইনটি লাইনে পড়ুন, স্ক্রিপ্টটি প্রয়োগ করুন এবং মুদ্রণ করুন।

    • -e: আপনাকে কমান্ড লাইন থেকে একটি স্ক্রিপ্ট পাস করতে দেয়।

    • s/.*/ Good Morning /: এটি বর্তমান পংক্তির পাঠ্যটি ( .*) শুভ মর্নিংয়ের সাথে প্রতিস্থাপন করবে ।

    • $.একটি বিশেষ পার্ল ভেরিয়েবল যা ইনপুট ফাইলের বর্তমান লাইন নম্বরটি ধারণ করে। সুতরাং, s/foo/bar/ if $.==5, মানে প্রতিস্থাপন fooসঙ্গে barশুধুমাত্র 5 ম লাইনে।

  2. sed

    sed -i '5s/.*/ Good Morning /' file{1..4}.txt

    ব্যাখ্যা:

    • -i: এর জন্য perl, জায়গায় ফাইল সম্পাদনা করুন।

    ডিফল্টরূপে, sedইনপুট ফাইলের প্রতিটি লাইন মুদ্রণ করে। 5s/pattern/replacement/5 ম লাইনে প্রতিস্থাপন সঙ্গে উপায়ে বিকল্প প্যাটার্ন।

  3. awk

    for f in file{1..4}.txt; do 
        awk 'NR==5{$0=" Good Morning "}1;' "$f" > foobar && mv foobar "$f"; 
    done

    ব্যাখ্যা:

    awk-iবিকল্পটির সমতুল্য নেই - যার অর্থ আমাদের একটি অস্থায়ী ফাইল ( foobar) তৈরি করতে হবে যা মূলটির ওভাররাইট করার জন্য পুনরায় নামকরণ করা হয়। বাশ লুপটি for f in file{1..4}.txt; do ... ; doneকেবল প্রতিটি file{1..4}.txtবর্তমান ফাইলের নাম সংরক্ষণ করে চলে যায় $f। ইন awk, NRবর্তমান লাইন নম্বর এবং বর্তমান লাইনের $0বিষয়বস্তু। সুতরাং, স্ক্রিপ্টটি $0কেবলমাত্র 5 তম লাইনে "গুড মর্নিং" দিয়ে লাইনটি ( ) প্রতিস্থাপন করবে । 1;হয় awk"লাইনের ছাপি" জন্য।

    N নতুন সংস্করণগুলি ডিভনুল তার উত্তরে দেখিয়েছে ।

  4. coreutils

    for f in file{1..4}.txt; do 
        (head -4 "$f"; echo " Good Morning "; tail -n +6 "$f") > foobar && 
        mv foobar "$f"; 
    done 

    ব্যাখ্যা:

    লুপটি পূর্ববর্তী বিভাগে ব্যাখ্যা করা হয়েছে।

    • head -4: প্রথম 4 লাইন মুদ্রণ করুন

    • echo " Good Morning ": "গুড মর্নিং" মুদ্রণ

    • tail -n +6: 6th ষ্ঠ লাইন থেকে ফাইলের শেষ পর্যন্ত সমস্ত কিছু মুদ্রণ করুন

    এই ( )তিনটি কমান্ডের আশেপাশে প্রথম বন্ধনী আপনাকে তিনটি আউটপুট ক্যাপচার করতে দেয় (সুতরাং 1 লা 4 লাইন, তারপরে "গুড মর্নিং", তারপরে বাকী রেখাগুলি) এবং সেগুলি একটি ফাইলে পুনর্নির্দেশ করতে পারে।


23

আপনি ব্যবহার করতে পারেন sed:

sed '5s/^/Good morning /' file

Good morningএকটি ফাইলের পঞ্চম লাইনে সংযোজন করা হবে।

আপনি যদি এর পরিবর্তে 5 লাইনে থাকা বিষয়বস্তুগুলি প্রতিস্থাপন করতে চান তবে বলুন:

sed '5s/.*/Good morning/' file

আপনি যদি ফাইলটিতে স্থান পরিবর্তনগুলি সংরক্ষণ করতে চান তবে -iবিকল্পটি ব্যবহার করুন :

sed -i '5s/.*/Good morning/' file

sedএকসাথে একাধিক ফাইল পরিচালনা করতে পারে। আপনি কমান্ডের শেষে আরও ফাইলের নাম যুক্ত করতে পারেন। আপনি নির্দিষ্ট ফাইলগুলি মেলাতে ব্যাশ বিস্তৃতিও ব্যবহার করতে পারেন:

# manually specified
sed -i '5s/.*/Good morning/' file1.txt file2.txt file3.txt file4.txt

# wildcard: all files on the desktop
sed -i '5s/.*/Good morning/' ~/Desktop/*

# brace expansion: file1.txt, file2.txt, file3.txt, file4.txt
sed -i '5s/.*/Good morning/' file{1..4}.txt

আপনি এখানে ব্রেস সম্প্রসারণ সম্পর্কে আরও পড়তে পারেন


জিএনইউ বিশুদ্ধ সংস্করণ ৪.১.০ এবং উচ্চতরগুলি এমন একটি এক্সটেনশান নিয়ে আসে যা স্থানের সম্পাদনা সক্ষম করে। সুতরাং আপনি বলতে পারেন:

gawk -i inplace 'NR==5{$0="Good morning"}7' file

ফাইলের সাথে লাইন # 5 প্রতিস্থাপন করুন Good morning!


2

আমি পাইথন সমাধানটি দেখতে পাইনি তাই এখানে এটি রয়েছে:

import sys
import os
def open_and_replace(filename):

    with open(filename) as read_file:
        temp = open("/tmp/temp.txt","w")
        for index,line in enumerate(read_file,1):
            if  index == 5:
                temp.write("NEW STRING\n")
            else:
                temp.write(line.strip() + "\n")
        temp.close()
    os.rename("/tmp/temp.txt",filename)

for file_name in sys.argv[1:]:
    open_and_replace(file_name)

মূল ধারণাটি হ'ল আর্গুমেন্ট হিসাবে কমান্ড-লাইনে প্রদত্ত প্রতিটি ফাইলের জন্য, আমরা একটি অস্থায়ী ফাইল লিখি এবং প্রতিটি ফাইলকে মূল ফাইলটিতে গণনা করি। লাইনটির সূচক যদি 5 হয় তবে আমরা আলাদা আলাদা লাইনটি লিখি। বাকিগুলি কেবলমাত্র টেম্পল ফাইল ডেমো দিয়ে পুরানো ফাইলটি প্রতিস্থাপন করছে:

$> ls
file1.txt  file2.txt  file3.txt
$> cat file1.txt                                                               
line 1
line 2
line 3
line 4
GOOD MORNING
line 6
$> python ~/replace_5th_line.py file1.txt file2.txt  file3.txt                 
$> cat file1.txt                                                               
line 1
line 2
line 3
line 4
NEW STRING
line 6
$> cat file2.txt                                                               
line 1
line 2
line 3
line 4
NEW STRING
line 6

একই তালিকা বোধগম্যতা সঙ্গে অর্জন করা যেতে পারে। নীচে একই স্ক্রিপ্টের একটি-লাইনার রয়েছে:

cat /etc/passwd | python -c 'import sys; print "\n".join(["CUSTOM"  if index == 5 else line.strip() for index,line in enumerate(sys.stdin,1)])'

বা ছাড়া cat

python -c 'import sys; print "\n".join(["CUSTOM"  if index == 5 else line.strip() for index,line in enumerate(sys.stdin,1)])' < /etc/passwd

যা বাকি আছে তা হ'ল সম্পাদিত সামগ্রীর আউটপুটকে অন্য কোনও ফাইলের সাথে পুনঃনির্দেশ করা > output.txt


1

আপনি এক্স মোডে ভিম ব্যবহার করতে পারেন:

for b in 1 2 3 4
do
  ex -sc '5c|Good Morning' -cx file"$b".txt
done
  1. 5 5 ম লাইন নির্বাচন করুন

  2. c পাঠ্য প্রতিস্থাপন

  3. x পরিবর্তনগুলি করা হয়েছে (তাদের আছে) এবং ছেড়ে দিলে লিখুন


0

নীচে একটি বাশ স্ক্রিপ্ট যা এই উত্তরে প্রস্তাবিত পার্ল প্রক্রিয়াটি গুটিয়ে রাখে

উদাহরণ:

/ Tmp / 'এটা

console:
  enabled:false

তারপরে নিম্নলিখিতটি চালান:

$ search_and_replace_on_line_of_file.sh false true 2 /tmp/it

এবং ফাইল এখন রয়েছে

/ Tmp / 'এটা

console:
  enabled:true

search_and_replace_on_line_of_file.sh

function show_help()
{
  IT=$(CAT <<EOF

  usage: SEARCH REPLACE LINE_NUM FILE

  e.g. 

  false true 52 /tmp/it  -> replaces false with true on line 52 of file /tmp/it

  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$4" ]
then
  show_help
fi

SEARCH_FOR=$1
REPLACE_WITH=$2
LINE_NO=$3
FILE_NAME=$4
perl -i -pe "s/$SEARCH_FOR/$REPLACE_WITH/ if $.==$LINE_NO" $FILE_NAME 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.