প্রতিটি লাইনের শুরুতে একটি উপসর্গ যুক্ত করুন string


334

নীচের মতো আমার কাছে একটি ফাইল রয়েছে:

line1
line2
line3

এবং আমি পেতে চাই:

prefixline1
prefixline2
prefixline3

আমি একটি রুবি স্ক্রিপ্ট লিখতে পারি, তবে আমার প্রয়োজন না হলে এটি আরও ভাল।

prefixউপস্থিত থাকবে //opt/workdir/উদাহরণস্বরূপ এটি একটি পথ ।

উত্তর:


526
# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file

# If you want to create a new file
sed -e 's/^/prefix/' file > file.new

যদি prefixএতে থাকে তবে /আপনি অন্য কোনও অক্ষর ব্যবহার করতে পারবেন না prefix, বা এড়িয়ে যেতে পারেন /, সুতরাং sedআদেশটি হয়ে যায়

's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'

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

1
আপনি sedপাইপলাইনে যেমন ব্যবহার করতে পারেন তা ভুলে যাবেন না , যেমন foo | sed -e 's/^/x /' | bar
জিগগ

1
পছন্দ করুন অন্য উপায় হবে sed -e '2,$s/^/prefix/'
অলোক সিংহল

1
@ বিনচেন (একক-উদ্ধৃত স্ট্রিংগুলিতে) বা (দ্বিগুণ-উদ্ধৃত স্ট্রিংগুলিতে) এর /মতো পালাতে পারেন\/\\/

8
sed -e 's/$/postfix/' fileআপনি যদি প্রতিটি লাইনের শেষে স্ট্রিং যুক্ত করতে চান তবে ব্যবহার করুন।
ব্রায়ান

121
awk '$0="prefix"$0' file > new_file

পার্ল সহ (স্থান প্রতিস্থাপনে):

perl -pi 's/^/prefix/' file

8
একটি পাইপ / স্ট্রিম বা পরিবর্তনশীল সহ:prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
থারস্মমনার

2
একটি বড় ফাইল (12 জি) সহ, awkপ্রতিবেদন করে awk: out of memory in readrec 1 source line number 1তবে সমাধানটি sedসাফল্যের সাথে শেষ করে।
jrm

33

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

ex -sc '%s/^/prefix/|x' file
  1. % সমস্ত লাইন নির্বাচন করুন

  2. s প্রতিস্থাপন করা

  3. x সংরক্ষণ করেন এবং বন্ধ করেন


1
আমার জন্য, আমি কেবল ফাইলটি ভিএম এবং টাইপ করে খুলি :%s/^/prefix/, যেহেতু এই কৌশলটি অনেক পরিস্থিতিতে কার্যকর হতে পারে
ফ্রাঙ্ক ব্রাইস

23

যদি আপনার উপসর্গটি কিছুটা জটিল হয় তবে কেবল এটি একটি ভেরিয়েবলের মধ্যে রাখুন:

prefix=path/to/file/

তারপরে, আপনি সেই পরিবর্তনশীলটি পাস করেন এবং এর সাথে বিশদ চুক্তি করতে দিন:

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt


6

শেল ব্যবহার:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file

5

এখানে আরও ব্যবহারযোগ্য tsকমান্ডটি ব্যবহার করে একটি হাইটলি রিডেবল অনলাইনার সলিউশন

$ cat file | ts prefix | tr -d ' '

এবং এটি কীভাবে ধাপে ধাপে উত্পন্ন হয়েছে:

# Step 0. create the file

$ cat file
line1
line2
line3
# Step 1. add prefix to the beginning of each line

$ cat file | ts prefix
prefix line1
prefix line2
prefix line3
# Step 2. remove spaces in the middle

$ cat file | ts prefix | tr -d ' '
prefixline1
prefixline2
prefixline3

অনেকগুলি লিনাক্স ডিস্ট্রোজে ডিফল্টরূপে 'ts' ইনস্টল করা হয় না। এছাড়াও, নিম্নগঠন করা কারণ এই উত্তরে "টিআর-ডি ''" অনুসরণ করার ফলে লাইনগুলি থেকে সমস্ত স্পেস মুছে ফেলা হবে, কেবল 'টিএস' দ্বারা যুক্ত করা স্থান নয়
টিম বার্ড

3

যদিও আমি মনে করি না যে পাইয়ারের এই উদ্বেগ ছিল, তবে আমার এমন একটি সমাধানের দরকার ছিল যা কোনও ফাইলের লাইভ "লেজ" থেকে আউটপুটটি বিলম্বিত না করে, যেহেতু আমি এক সাথে কয়েকটি সতর্কতা লগগুলি একই সাথে পর্যবেক্ষণ করতে চেয়েছিলাম, প্রতিটি লাইনটিকে তার নিজের লগের নামের সাথে উপস্থাপন করছিলাম ।

দুর্ভাগ্যক্রমে, সেড, কাট ইত্যাদি খুব বেশি বাফারিং চালু করেছে এবং সর্বাধিক বর্তমানের লাইনগুলি দেখতে আমাকে বাধা দিয়েছে। স্টিভেন পেনির -sবিকল্পটি ব্যবহার করার পরামর্শটি nlআকর্ষণীয় ছিল এবং পরীক্ষার মাধ্যমে প্রমাণিত হয়েছিল যে এটি আমাকে উদ্বিগ্ন অযাচিত বাফারিংয়ের পরিচয় দেয়নি।

nlঅযাচিত লাইন নম্বরগুলি ছাঁটাই করার আকাঙ্ক্ষার সাথে সম্পর্কিত যদিও ব্যবহার করার ক্ষেত্রে বেশ কয়েকটি সমস্যা ছিল (আপনি যদি এটির নান্দনিকতার বিষয়ে যত্ন নাও করেন তবে অতিরিক্ত কলামগুলি ব্যবহার করা অনাকাঙ্ক্ষিত হতে পারে) এমন ঘটনাও ঘটতে পারে। প্রথমে সংখ্যাগুলি কাটাতে "কাটা" ব্যবহার করে বাফারিং সমস্যাটি পুনরায় পরিচয় করানো হয়, সুতরাং এটি সমাধানটি নষ্ট করে দেয়। দ্বিতীয়ত, "-w1" ব্যবহার করে কোনও লাভ হয় না, যেহেতু এটি একক কলামে লাইন নম্বর সীমাবদ্ধ করে না - আরও অঙ্কের প্রয়োজন হওয়ায় এটি আরও প্রশস্ত হয়।

আপনি অন্য কোথাও এটি ক্যাপচার করতে চান তা সুন্দর নয়, তবে যেহেতু আমার যা করার দরকার ছিল না ঠিক তাই (সমস্ত কিছু আগে থেকেই ফাইল লগ করার জন্য লেখা ছিল, আমি কেবল রিয়েল টাইমে একবারে বেশ কয়েকটি দেখতে চেয়েছিলাম), সেরা লাইন নম্বরগুলি হারাতে এবং কেবল আমার উপসর্গ করার উপায়টি ছিল -sক্যারেজ রিটার্ন (সিআর বা ^ এম বা সিটিআরএল-এম) দিয়ে স্ট্রিং শুরু করা । উদাহরণস্বরূপ:

#!/bin/ksh

# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.

PGRP=$$

for LOGFILE in widget framas dweezil
do
(
    tail -f $LOGFILE 2>&1 |
    nl -s"^M${LOGFILE}>  "
) &
sleep 1
done

read KILLEM

kill -- -${PGRP}

1
-uবাফারিং এড়ানোর জন্য সেড অপশনটি ব্যবহার করুন ।
ব্রায়ান লার্সন

2
আনফার / স্ট্ডবুফ দিয়ে বাফারিং বন্ধ করা যেতে পারে, unix.stackexchange.com/q/25372/6205 দেখুন
মাইরোস্লাভ

2

এড ব্যবহার:

ed infile <<'EOE'
,s/^/prefix/
wq
EOE

এই বিকল্পটি, প্রতিটি লাইনের ( ,) জন্য, রেখার শুরু ( ^) সহ prefixwqসংরক্ষণ করে এবং প্রস্থান করে

যদি প্রতিস্থাপনের স্ট্রিংয়ে একটি স্ল্যাশ থাকে তবে আমরা এর sপরিবর্তে ভিন্ন ভিন্ন সীমানা ব্যবহার করতে পারি :

ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE

EOEপ্যারামিটারের প্রসারণ রোধ করতে আমি এখানে ডক ডেলিফিমটার (" এডের শেষ") উদ্ধৃত করেছি । এই উদাহরণস্বরূপ, এটি অপ্রকাশিত পাশাপাশি কাজ করবে, তবে যদি $আপনার এডি স্ক্রিপ্টে কখনও অবাক হয় তবে অবাক করা থেকে রক্ষা করা ভাল অনুশীলন ।


2

ব্যবহার করে & (প্যাটার্নের সাথে মিলে যাওয়া ইনপুটটির পুরো অংশ "):

cat in.txt | sed -e "s/.*/prefix&/" > out.txt

বা পিছনে উল্লেখ ব্যবহার:

cat in.txt | sed -e "s/\(.*\)/prefix\1/" > out.txt

2
  1. আপনি ব্যাকেরেফারেন্স কৌশল ব্যবহার করে এটি অর্জন করতে পারেন

    sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
    
  2. আপনি এর মতো awk দিয়েও ব্যবহার করতে পারেন

    awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
    

1

এই উত্তরsed থেকে পদ্ধতির ব্যবহার করে এখানে একটি মোড়ানো উদাহরণ রয়েছে :

$ cat /path/to/some/file | prefix_lines "WOW: "

WOW: some text
WOW: another line
WOW: more text

prefix_lines

function show_help()
{
  IT=$(CAT <<EOF
    Usage: PREFIX {FILE}

    e.g.

    cat /path/to/file | prefix_lines "WOW: "

      WOW: some text
      WOW: another line
      WOW: more text
  )
  echo "$IT"
  exit
}

# Require a prefix
if [ -z "$1" ]
then
  show_help
fi

# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
  # If no stdin exists
  if [ -t 0 ]; then
    show_help
  fi
  FILE=/dev/stdin
fi

# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE

2
PREFIXস্ল্যাশের মতো শেডের জন্য বিশেষ কোনও অক্ষর থাকলে এটি কাজ করবে না ।
জোশ

ভাল পয়েন্ট ... আপনি যদি খুব বেশি স্ল্যাশ ব্যবহার করে দেখতে পান তবে আপনি সেড অংশের সাথে আলাদা আলাদা ডিলিমিটার ব্যবহার করতে পারেন, এখানে বিস্তারিত হিসাবে , যা আপনাকে অনুসন্ধানগুলিতে এটি ব্যবহার করতে দেয়। অন্যান্য বিশেষ শেড চরগুলি একটি স্ল্যাশ সহ পালিয়ে এসে যোগ করা যেতে পারে, যেমনprefix_lines \*
ব্র্যাড পার্কস

0

BSD / OSX সিস্টেমে থাকা লোকেদের জন্য ইউটিলিটি বলা হয় lam, ল্যামিনেটের জন্য সংক্ষিপ্ত। lam -s prefix fileআপনি যা চান তা করবে আমি পাইপলাইনে এটি ব্যবহার করি, যেমন:

find -type f -exec lam -s "{}: " "{}" \; | fzf

... যা সমস্ত ফাইল খুঁজে পাবে, প্রতিটি ফাইলকে তার নিজস্ব ফাইলের নামের একটি উপসর্গ প্রদান করে, প্রতিটিটিতে লাম প্রয়োগ করবে। (এবং অনুসন্ধানের জন্য আউটপুট এফজেফ এ পাম্প করুন))


আমি উবুন্টুতে 19.10 এ আছি এবং এরকম কোনও আদেশ নেই
এনএফজি

আপনি ঠিক বলেছেন, এটি প্রদর্শিত হচ্ছে এটি কেবল BSD কমান্ড। পসিক্স এটিকে পেস্টের সাথে প্রতিস্থাপন করেছে, তবে পেস্টে সম্পূর্ণ বিভাজক স্ট্রিং যুক্ত করার বৈশিষ্ট্য নেই। আমি আমার উত্তর আপডেট করব।
রায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.