সেড বা অ্যাজকের সাথে প্যাটার্ন যুক্ত লাইনের শেষে কীভাবে যুক্ত করবেন?


89

উদাহরণস্বরূপ ফাইলটি এখানে:

somestuff...
all: thing otherthing
some other stuff

আমি যা করতে চাই তা হল এর সাথে শুরু হওয়া লাইনে যুক্ত করা all::

somestuff...
all: thing otherthing anotherthing
some other stuff

উত্তর:


168

এটি আমার পক্ষে কাজ করে

sed '/^all:/ s/$/ anotherthing/' file

প্রথম অংশটি একটি সন্ধানের প্যাটার্ন এবং দ্বিতীয় অংশটি $একটি লাইন শেষের জন্য ব্যবহার করে একটি সাধারণ সেডের প্রতিস্থাপন ।

প্রক্রিয়া চলাকালীন আপনি যদি ফাইলটি পরিবর্তন করতে চান তবে -iবিকল্পটি ব্যবহার করুন

sed -i '/^all:/ s/$/ anotherthing/' file

অথবা আপনি এটিকে অন্য কোনও ফাইলে পুনর্নির্দেশ করতে পারেন

sed '/^all:/ s/$/ anotherthing/' file > output

কেবল কিছু যুক্ত করা একটি নতুন লাইনের দিকে নিয়ে যায়, প্রতিস্থাপন করা সঠিক উপায়।
— zhy

11

এটি আপনার পক্ষে কাজ করা উচিত

sed -e 's_^all: .*_& anotherthing_'

S কমান্ড (বিকল্প) ব্যবহার করে আপনি এমন একটি লাইন অনুসন্ধান করতে পারেন যা নিয়মিত প্রকাশকে সন্তুষ্ট করে। উপরের কমান্ডে, &ম্যাচিং স্ট্রিংয়ের জন্য দাঁড়িয়েছে।


10

$0শর্তটির সাথে মেলে যদি আপনি পাঠ্যটিকে আঁকড়ে রাখতে পারেন:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

ব্যাখ্যা

  • /patt/ {...}যদি রেখাটি প্রদত্ত প্যাটার্নটির সাথে মেলে pattতবে তার মধ্যে বর্ণিত ক্রিয়াটি সম্পাদন করুন {}।
  • এই ক্ষেত্রে: /^all:/ {$0=$0" anotherthing"}যদি লাইনটি শুরু হয় (প্রতিনিধিত্ব করে ^) দিয়ে all:, তবে anotherthingলাইনে যুক্ত করুন।
  • 1সত্য শর্ত হিসাবে, এর ডিফল্ট ক্রিয়াকে ট্রিগার করে awk: বর্তমান লাইনটি মুদ্রণ করুন ( print $0)। এটি সর্বদা ঘটবে, সুতরাং এটি হয় মূল লাইনটি মুদ্রিত করবে বা পরিবর্তিত কোনও।

পরীক্ষা

আপনার প্রদত্ত ইনপুটটির জন্য এটি ফিরে আসে:

somestuff...
all: thing otherthing anotherthing
some other stuff

নোট আপনি ভেরিয়েবল যুক্ত করতে পাঠ্য সরবরাহ করতে পারে:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

সোলারিসে আপনি ত্রুটিটি পাবেন:awk: can't set $0
— শে

@ অবশেষে আপনি ব্যবহার করতে পারবেন /usr/xpg4/bin/awkকোনটি "ভাল" অবাস্তব।
— ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'


6

এখানে আরও একটি সহজ সমাধান সেড ব্যবহার করে।

$ sed -i 's/all.*/& anotherthing/g' filename.txt

ব্যাখ্যা:

all। * এর অর্থ সমস্ত লাইন 'সমস্ত' দিয়ে শুরু হয়েছিল।

এবং ম্যাচের প্রতিনিধিত্ব করুন (অর্থাত্ 'সমস্ত' দিয়ে শুরু হওয়া সম্পূর্ণ রেখা)

তারপরে সেডটিকে আগেরটির সাথে প্রতিস্থাপন করে এবং 'অন্য কিছু' শব্দ যুক্ত করে


4

বিশ্রী সহ সমাধান:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

সহজভাবে: সারিটি যদি সারিটি all"অন্য কিছু" মুদ্রণের সাথে শুরু হয় তবে অন্য সারিটি মুদ্রণ করুন।


4
আপনি এটি সংক্ষিপ্ত করতে পারেন:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
— গ্লেন জ্যাকম্যান

4
@ প্রমিথিউস, একটি অ্যাডক স্ক্রিপ্ট condition {actions}জোড়া দিয়ে তৈরি। যদি conditionবাদ দেওয়া হয় তবে প্রতিটি রেকর্ডের জন্য ক্রিয়া সম্পাদন করা হয়। যদি {actions}বাদ দেওয়া হয়, এবং শর্তটি সত্যের (যা সংখ্যার ক্ষেত্রে হয় 1) মূল্যায়ন করে তবে ডিফল্ট ক্রিয়াটি হ'ল বর্তমান রেকর্ডটি মুদ্রণ করা।
— গ্লেন জ্যাকম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.