শেড ব্যবহার করে স্ট্রিং সহ পুরো লাইনটি প্রতিস্থাপন করুন


319

আমার কাছে একটি পাঠ্য ফাইল রয়েছে যা একটি নির্দিষ্ট লাইনের মতো

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

আমাকে উপরের পুরো লাইনটি প্রতিস্থাপন করতে হবে

This line is removed by the admin.

অনুসন্ধানের শব্দটি হ'ল TEXT_TO_BE_REPLACED

এর জন্য আমাকে শেল স্ক্রিপ্ট লিখতে হবে। আমি কীভাবে এটি ব্যবহার করে অর্জন করতে পারি sed?


@ শ্যাচারন আমি সেড-আর্নের / (TEXT_TO_BE_REPLACED) + s + \ ডাব্লু + / yy 1 ইয়াহী / এক্সএক্সএক্সএক্স চেষ্টা করেছি তবে যদি ইয়ির উপস্থিত থাকে তবে এটি স্ট্রিংয়ে xxx এর সাথে yy প্রতিস্থাপন করবে। আমার ক্ষেত্রে পাঠ্য স্থির নয় ... আমার কাছে যা আছে তা সবই TEXT_TO_BE_REPLACED।
রাহুল

এটি একটি কার্যকর সিড এক্সপ্রেশন নয়। আপনি কি নিশ্চিত সেড দিয়ে এটি চান? ভাল রেজেক্সপ্স সহ যে কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ আপনার জন্য একটি প্রতিস্থাপন করতে পারে (একটি সাব ফাংশনের জন্য অনুসন্ধান করুন)। এটি নিজের দ্বারা বোঝার চেয়ে সহজ হবে
Scharron

@ শ্যাচারন ওয়েল, এটি শেল স্ক্রিপ্টের মাধ্যমে সম্পন্ন করা হবে যাতে আমার ধারণা হয় সেড আমার সেরা বেট।
রাহুল

উত্তর:


482

আপনি পুরো লাইনটি প্রতিস্থাপন করতে পরিবর্তন কমান্ডটি ব্যবহার করতে পারেন এবং -iফ্ল্যাগটি জায়গায় রেখে পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, GNU সেড ব্যবহার করে:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

4
নোট করুন যে সি before এর আগে আপনার একটি স্থান প্রয়োজন \ আমি এটি যুক্ত করার জন্য সম্পাদনা করেছি।
মার্কাস ডাউনিং

27
@MarcusDowning গনুহ sed নেই না স্থান প্রয়োজন; এটি মূল পোস্ট হিসাবে ঠিক কাজ করে। যদি আপনার নির্দিষ্ট সেডের জন্য জায়গার প্রয়োজন হয়, তবে যে কোনও উপায়ে কোনটি বেমানান তা নোট করুন এবং একটি মন্তব্য হিসাবে প্রয়োজনীয় অনুরোধটি যুক্ত করুন। তবে দয়া করে কোনও গৃহীত উত্তরে কাজের কোড পরিবর্তন করবেন না।
টড এ জ্যাকবস

7
"এটি ..." পাঠ্যের পরিবর্তে আমি কীভাবে একটি চলক ব্যবহার করতে পারি? যদি আমি এটিকে $ ভেরিয়েবল দ্বারা প্রতিস্থাপন করি তবে এটি এর বিষয়বস্তুটি নয় তবে পরিবর্তনশীল নামটি মুদ্রণ করে।
স্টিভেন

18
c\ কোনও ভেরিয়েবল দ্বারা সরাসরি অনুসরণ করার সাথে একটি সমস্যা রয়েছে : …c\$VAR…ব্যাকস্ল্যাশ ডলার থেকে পালাতে পারে। এই ক্ষেত্রে আমি (উবুন্টু 15.10 এ বাশ / সেড) লিখতে হয়েছিল…c\\$VAR…
জানুয়ারী

6
একটি ম্যাক ব্যবহার: sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo; (যখন প্রথম প্যারামটি ফাঁকা থাকে এটি ফাইল-এ সম্পাদনা করে, অন্যথায় একটি ব্যাকআপ তৈরি করে)
AndreDurao

152

.*পুরো লাইনটি প্রতিস্থাপন করার জন্য আপনাকে আগে এবং পরে ওয়াইল্ডার্ডস ব্যবহার করতে হবে :

sed 's/.*TEXT_TO_BE_REPLACED.*/This line is removed by the admin./'

আপনাকে ধন্যবাদ, খনি কাজ করেছেন: কিন্তু এর /.* <অভিব্যক্তি> * / <অভিব্যক্তি> SE_LABEL = এবিসি <অভিব্যক্তি> / ছ। 'MYR2.xml> test.txt
Nasri নাজিব

9
এটি ম্যাক ওএস এক্স ইয়োসেমাইটে ব্যতিক্রম নিয়ে কাজ করছে যে আমি নীচে -i এবং -e পতাকা ব্যবহার করছি:sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
কেন্ট বুল

1
@ কেনট জনসন আমার ধারণা আপনার কমান্ডে মিল নেই।
হাশহাজার্ড 12'15

@ এমবার্নেট আপনি ঠিক বলেছেন, আমার সেখানে দুটি ডাবল উক্তি থাকা উচিত।
কেন্ট বুল

2
শুধু সম্পূর্ণ তথ্যের জন্য। এটিকে -i
অন্তর্নিহিত

20

গৃহীত উত্তরটি বেশ কয়েকটি কারণে আমার পক্ষে কার্যকর হয়নি:

  • আমার সেডের সংস্করণটি -iশূন্য দৈর্ঘ্যের এক্সটেনশনের সাথে পছন্দ করে না
  • c\কমান্ডটির বাক্য গঠনটি অদ্ভুত এবং আমি এটি কাজ করতে পারি না
  • আমি বুঝতে পারি না যে আমার কিছু সমস্যা অনাকাঙ্ক্ষিত স্ল্যাশ থেকে আসছে

সুতরাং এখানে আমি সমাধানটি নিয়ে এসেছি যা আমি মনে করি বেশিরভাগ ক্ষেত্রেই কাজ করা উচিত:

function escape_slashes {
    sed 's/\//\\\//g' 
}

function change_line {
    local OLD_LINE_PATTERN=$1; shift
    local NEW_LINE=$1; shift
    local FILE=$1

    local NEW=$(echo "${NEW_LINE}" | escape_slashes)
    sed -i .bak '/'"${OLD_LINE_PATTERN}"'/s/.*/'"${NEW}"'/' "${FILE}"
    mv "${FILE}.bak" /tmp/
}

সুতরাং সমস্যাটি সমাধানের জন্য নমুনার ব্যবহারের বিষয়টি উত্থাপিত:

change_line "TEXT_TO_BE_REPLACED" "This line is removed by the admin." yourFile

18

উপরের উত্তর:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

প্রতিস্থাপনের স্ট্রিং / লাইন পরিবর্তনশীল না হলে সূক্ষ্মভাবে কাজ করে।

সমস্যাটি হল এই যে রেডহ্যাট 5 উপর \পরে cপালাতে $। একটি \\ডাবলও কাজ করেনি (কমপক্ষে রেডহাট 5 এ)।

হিট অ্যান্ড ট্রায়ালের মাধ্যমে, আমি আবিষ্কার করেছি যে \পরে cযদি আপনার প্রতিস্থাপনের স্ট্রিং / লাইনটি কেবল একটি একক লাইন হয় তবে তা অনর্থক। সুতরাং আমি এর \পরে ব্যবহার করিনি c, একক প্রতিস্থাপন লাইন হিসাবে একটি ভেরিয়েবল ব্যবহার করেছি এবং এটি আনন্দ joy

কোডটি দেখতে এমন কিছু দেখাচ্ছে:

sed -i "/TEXT_TO_BE_REPLACED/c $REPLACEMENT_TEXT_STRING" /tmp/foo

একক উদ্ধৃতির পরিবর্তে ডাবল উদ্ধৃতি ব্যবহার নোট করুন।


আপনি এখনও এর মতো একক উদ্ধৃতি ব্যবহার করতে পারেন: sed -i '/ TEXT_TO_BE_REPLACED / c' "AR পরিবর্তনশীল" "" / tmp / foo
অ্যালিস্টার

4

এখনও অবধি দেওয়া সমস্ত উত্তর ধরেই ধরে নেওয়া হয় যে পাঠ্যটি প্রতিস্থাপন করা উচিত যা আপনি বোধগম্য হবেন, যেহেতু ওপি জিজ্ঞাসা করেছিল about আমি একটি উত্তর সরবরাহ করছি যা ধরে নিচ্ছে যে প্রতিস্থাপন করা হবে এমন পাঠ্য সম্পর্কে আপনার কিছুই জানা নেই এবং আপনি যে প্রতিস্থাপন করতে চান না সেই একই বা অনুরূপ সামগ্রী সহ ফাইলে আলাদা লাইন থাকতে পারে। তদুপরি, আমি ধরে নিচ্ছি যে আপনি প্রতিস্থাপন করতে হবে রেখার লাইন নম্বর জানেন।

নিম্নলিখিত উদাহরণগুলি নির্দিষ্ট লাইন সংখ্যা দ্বারা পাঠ্য অপসারণ বা পরিবর্তনটি প্রদর্শন করে:

# replace line 17 with some replacement text and make changes in file (-i switch)
# the "-i" switch indicates that we want to change the file. Leave it out if you'd
#   just like to see the potential changes output to the terminal window.
# "17s" indicates that we're searching line 17
# ".*" indicates that we want to change the text of the entire line
# "REPLACEMENT-TEXT" is the new text to put on that line
# "PATH-TO-FILE" tells us what file to operate on
sed -i '17s/.*/REPLACEMENT-TEXT/' PATH-TO-FILE

# replace specific text on line 3
sed -i '3s/TEXT-TO-REPLACE/REPLACEMENT-TEXT/'

3

কনফিগার ফাইলের কারসাজির জন্য

আমি স্ক্যানসেল উত্তর দ্বারা অনুপ্রাণিত এই সমাধান নিয়ে এসেছি

configLine [searchPattern] [replaceLine] [filePath]

এটি হবে:

  • উপস্থিত না থাকলে ফাইলটি তৈরি করুন
  • পুরো রেখাটি (সমস্ত লাইন) প্রতিস্থাপন করুন যেখানে অনুসন্ধানের প্যাটার্ন মেলে
  • যোগ replaceLine ফাইলের প্রান্তে যদি প্যাটার্ন পাওয়া যায়নি

ফাংশন:

function configLine {
  local OLD_LINE_PATTERN=$1; shift
  local NEW_LINE=$1; shift
  local FILE=$1
  local NEW=$(echo "${NEW_LINE}" | sed 's/\//\\\//g')
  touch "${FILE}"
  sed -i '/'"${OLD_LINE_PATTERN}"'/{s/.*/'"${NEW}"'/;h};${x;/./{x;q100};x}' "${FILE}"
  if [[ $? -ne 100 ]] && [[ ${NEW_LINE} != '' ]]
  then
    echo "${NEW_LINE}" >> "${FILE}"
  fi
}

উন্মাদ প্রস্থান স্থিতি যাদুটি https://stackoverflow.com/a/12145797/1262663 থেকে আসে


2
bash-4.1$ new_db_host="DB_HOSTNAME=good replaced with 122.334.567.90"
bash-4.1$ 
bash-4.1$ sed -i "/DB_HOST/c $new_db_host" test4sed
vim test4sed
'
'
'
DB_HOSTNAME=good replaced with 122.334.567.90
'

এটা ঠিক কাজ করে


1

আমার মেকফাইলে আমি এটি ব্যবহার করি:

@sed -i '/.*Revision:.*/c\'"`svn info -R main.cpp | awk '/^Rev/'`"'' README.md

পিএস: না ভুলে যাবেন যে -i আসলে ফাইলের পাঠ্যটি পরিবর্তন করে ... তাই আপনি যদি "সংশোধন" হিসাবে সংজ্ঞায়িত প্যাটার্নটি পরিবর্তন করেন তবে আপনি প্রতিস্থাপনের জন্যও প্যাটার্নটি পরিবর্তন করবেন।

উদাহরণ আউটপুট:

জন দো লিখেছেন এবিসি-প্রকল্প

সংশোধন: 1190

সুতরাং আপনি যদি "পুনর্বিবেচনা: 1190" প্যাটার্নটি সেট করেন তবে আপনি অবশ্যই "সংশোধন:" হিসাবে সংজ্ঞায়িত করেছেন ঠিক তেমন নয় ...


1
cat find_replace | while read pattern replacement ; do
sed -i "/${pattern}/c ${replacement}" file    
done 

সন্ধানের_প্লেস ফাইলটিতে 2 টি কলাম, ম্যাচ করার জন্য প্যাটার্ন সহ সি 1, প্রতিস্থাপনের সাথে সি 2, সেড লুপ প্রতিটি লাইনকে ভেরিয়েবল 1 এর প্যাটার্নের একটিতে সংযুক্ত করে প্রতিস্থাপন করে


না, এটি বেশ কয়েকটি ক্ষেত্রে ভুল on sedআপনি সম্পাদনা করতে চান এমন প্রতিস্থাপনগুলি সহ একটি স্ক্রিপ্ট ফাইল দিয়ে একবার চালান । sed -iএকই ফাইলটিতে বারবার চালানো একটি ভয়ঙ্কর অ্যান্টিপ্যাটার্ন।
ট্রিপলি

0

এটি উপরেরটির মতোই ..

sed 's/[A-Za-z0-9]*TEXT_TO_BE_REPLACED.[A-Za-z0-9]*/This line is removed by the admin./'

3
এটিতে পরিবর্তন FOO=TEXT_TO_BE_REPLACEDহয় FOO=This line ...তবে নির্দিষ্টকরণের সাথে মেলে না।
জেনস

হ্যাঁ .. আমাদের প্রয়োজনীয়তাটি হ'ল অ্যাডমিন দ্বারা এই লাইনটি সরানো হয়েছে। যদি আমরা কী প্যাট্রেন 'TEXT_TO_BE_REPLACED' পাই। উপরের আদেশটি সন্তোষজনক is আমার বুঝতে ভুল হলে আমাকে সংশোধন করুন .. @ জেনস
অন্নপুর্ডে হরি

@ অ্যানাপিউরেডিহারি এই উত্তরটি কাজ করে না যদি অনুসন্ধানের স্ট্রিংয়ের আগে বা পরে লেখাগুলিতে এ-জা-জেড -00 -9 ছাড়াও কিছু থাকে। এটি সমান চিহ্ন হিসাবে যদি ব্যর্থ হয়, যেমন জেনস নির্দেশ করেছেন। "FOO =" অংশটি থাকবে; আপনি সম্পূর্ণ লাইন প্রতিস্থাপন করেন নি। এই কোডটি ফাইলের মধ্যে কী হতে পারে সে সম্পর্কে স্বল্প দৃষ্টি দেওয়া। আপনার যদি ওয়াইল্ডকার্ড বোঝানো হয় তবে থোরের উত্তরটি দেখায় আপনার ওয়াইল্ডকার্ড লাগানো উচিত।
মাউথ

0

নীচে কমান্ড আমার জন্য কাজ করছে। যা ভেরিয়েবল নিয়ে কাজ করছে

sed -i "/\<$E\>/c $D" "$B"

তবে আমার নতুন প্রয়োজন প্রতিস্থাপনের সময় মন্তব্য করা (# দিয়ে শুরু) এসকেআইপি করা to যেহেতু আমরা সম্পূর্ণ লাইনটি প্রতিস্থাপন করছি এটি মন্তব্য করা রেখাগুলিও প্রতিস্থাপন করবে এবং আপনি সদৃশ বৈশিষ্ট্য সহ শেষ করবেন। কারও কাছে যদি এর সমাধান থাকে তবে দয়া করে আমাকে জানান।
রীতেশ বোরকার

-1

আমি প্রায়শই ফাইল থেকে ডেটা আহরণের জন্য রেজেেক্স ব্যবহার করি আমি কেবল এটি ব্যবহার করেছি: কিছুই না \"দিয়ে আক্ষরিক উক্তিটি প্রতিস্থাপন করতে //:-)

cat file.csv | egrep '^\"([0-9]{1,3}\.[0-9]{1,3}\.)' | sed  s/\"//g  | cut -d, -f1 > list.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.