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


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.