একটি নির্দিষ্ট চরিত্রের আগে আমি কীভাবে অক্ষরগুলি বড় করে তুলতে পারি? (^)


5

আমি এটি রূপান্তর করতে চাই:

foo^bar
ba^rfoo
oofrab
raboof^

এটি:

FOObar
BArfoo
oofrab
RABOOF

"^" এর আগে যে কোনও কিছু (বা অন্য কোনও বিশেষ চরিত্র যদি এটি আরও সহজ করে তোলে) মূলধন হয়ে যায়

এছাড়াও, "^" মুছে ফেলারও প্রয়োজন হয় না যদি এটি আরও সহজ করে তোলে।


ব্যবহারিক প্রয়োগ কী এবং আপনি কেন সেই ভাষা / সরঞ্জামগুলিকে ট্যাগগুলিতে তালিকাবদ্ধ করেন? লোকেরা যেকোন ভাষা / সরঞ্জাম পছন্দ করতে বেছে নিতে পারে?
থোমস্রুটটার

এটি এর উদ্দেশ্যটির একটি দীর্ঘ গল্প, তবে শেষ পর্যন্ত আমি শব্দগুলির বাইরে চিত্র তৈরি করছি এবং আমি জিনিসকে দ্রুত পুঁজি করার জন্য একটি সংক্ষিপ্ত পথ খুঁজছি। এবং সরঞ্জামগুলির বিভিন্ন তালিকার জন্য, মানুষের পক্ষে যা করা সহজ। এটি আমাকে বিভিন্ন কাজের জন্য কোন সরঞ্জামটি সঠিক তা শিখতে সহায়তা করে
TuxforLife

এই ক্ষেত্রেটি কী:foo^bar^foo
এবি

আমার ক্ষেত্রে, এর ঘটনার 99.9% সম্ভাবনা রয়েছে, সুতরাং যদি সেই দৃশ্যে এটি সঠিকভাবে কাজ না করে তবে কোনও বড় কথা নয়!
টাকসফোরলাইফ

উত্তর:


8

জিএনইউ sed(উবুন্টুর ডিফল্ট) ব্যবহার করে ( -rবিকল্পের পরামর্শের জন্য পাবুককে ধন্যবাদ ):

< inputfile sed -r 's/^(.*)\^/\U\1\E/' > out

ব্যবহার করে perl(সংক্ষিপ্ত রেজেক্সের জন্য অলিকে ধন্যবাদ):

< inputfile perl -pe 's/^(.*)\^/\U\1\E/' > out

কমান্ড # 1 ব্রেকডাউন :

  • < inputfile: বিষয়বস্তুর পুননির্দেশনা inputfileকরতেstdin
  • -r: বর্ধিত রেগেক্সগুলির ব্যবহারের অনুমতি দেয়
  • > out: বিষয়বস্তুর পুননির্দেশনা stdoutকরতেout

কমান্ড # 2 ব্রেকডাউন :

  • < inputfile: বিষয়বস্তুর পুননির্দেশনা inputfileকরতেstdin
  • > out: বিষয়বস্তুর পুননির্দেশনা stdoutকরতেout

রেজেক্স ব্রেকডাউন :

  • s: একটি প্রতিস্থাপন সম্পাদন করে
  • /: রেজেক্স শুরু হয়
  • ^: লাইনের শুরুটির সাথে মেলে
  • (: প্রথম ক্যাপচারিং গ্রুপ শুরু করে
  • .*: অক্ষরের সংখ্যার সাথে মেলে matches
  • ): প্রথম ক্যাপচারিং গ্রুপটি থামায়
  • \^: একটি ^চরিত্রের সাথে মেলে
  • /: রেজেক্স থামায় / প্রতিস্থাপন শুরু করে
  • \U: বড় হাতের মধ্যে রূপান্তর শুরু
  • \1: প্রথম ক্যাপচারিং গ্রুপের সাথে প্রতিস্থাপন করে
  • \E: বড়হাতে রূপান্তর বন্ধ করে দেয়
  • /: প্রতিস্থাপন বন্ধ করে দেয়

1
হ্যালো কোস, প্রায় সেখানে, তবে এটি বিপরীতে করছে। আমি ফুবারের পরিবর্তে ফুবার পাচ্ছি। echo foo^bar | sed 's/^\(.*\)\^\(.*\)$/\1\U\2/'
টাক্সফোরলাইফ

1
@ টাক্সফোর্ডলাইফ আপনি "@ কোস"
কোস

2
দ্বিতীয় কমান্ডের একটি কমান্ড অনুপস্থিত! আমার মনে হয় আপনি ভুলে গেছেন a perl। এছাড়াও আপনাকে দ্বিতীয় ক্যাপচারের সাথে দ্বিতীয় ক্যাপচারটি প্রতিস্থাপন করতে হবে না। শুধু এটি ক্যাপচার করবেন না। s/^(.*)\^/\U\1/কাজ করবে
অলি

1
জিএনইউ -rsed -r 's/^(.*)\^/\U\1/'
সিডের সাহায্যে রেগেক্সের

2
কোন জিএনইউ সেড সংস্করণ সমর্থন করে \U?
কিউংলম

5

ব্যবহার vim:

vim -es '+g/\^/normal gUf^' +wq foo
  • -esপ্রবীণ প্রাক্তন মোড সক্রিয়, এবং নীরব তেজ (বেশিরভাগই)।
  • + কমান্ড-লাইন আর্গুমেন্ট হিসাবে ভিআইএম কমান্ড সরবরাহ করতে ব্যবহৃত হয়।
  • g/\^/ - সমস্ত লাইন মিলছে কমান্ড চালান /\^/
  • normal - অন্যান্য কমান্ডটি একটি সাধারণ মোড ক্রিয়া হিসাবে চালান।
  • gUf^- ( gU) অবধি বড় রূপান্তর করুন ^( f^)। g/.../এই ক্ষেত্রে ব্যাপ্তি ব্যবহার করার সময় ), কমান্ডটি কার্যকর করার আগে প্রতিটি লাইনটির শুরুতে কার্সারটি স্থাপন করা হয়।
  • তারপরে সংরক্ষণ এবং ছেড়ে দিন ( wq)।

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

vim -es '+g/\^./norm $F^gU0' '+g/\^$/norm gU$' +wq foo

muru, শুধুমাত্র প্রথমত মূলধনী পরার, যেমন, `যদি foo ^ বার ^ baz`
Sergiy Kolodyazhnyy

@ সার্গ হ্যাঁ এটিই fহয় - চরিত্রটির প্রথম উদাহরণে যান।
মুড়ু

সমস্ত দৃষ্টান্তকে মূলধন করার কোনও উপায় আছে কি? আমি সত্যিই পছন্দ করি যে ভিম সেই একই ফাইলটিতে ফিরে আসে, সুতরাং এটি আদর্শ হবে যদি এটি সমস্ত দৃষ্টান্তকে মূলধন করে
তোলে

@ সার্জ এক পাসে নয় এমন কোনও সরল গতি নেই যা একটি চরিত্রের শেষ ঘটনায় নিয়ে যায় (প্লাগইন গণনা করে না)। আপনার করতে হবে: vim '+g/\^./norm $F^gU0' '+g/\^$/norm gU$' +wq foo- শেষ না হওয়া লাইনের জন্য প্রথম কমান্ড এবং শেষ হওয়া ^লাইনের জন্য দ্বিতীয় কমান্ড ^
মুরু

ওই কাজগুলো ! আপনি কি আপনার উত্তরে এটি যুক্ত করতে পারেন? আমি
উঁচুতে

3

আমি প্রথম ক্ষেত্রের উপরের ক্ষেত্রে ^ফিল্ড বিভাজক হিসাবে সেট করব awk:

$ awk 'BEGIN{FS="^"; OFS=""} NF>1{$1=toupper($1)}1' file
FOObar
BArfoo
oofrab
RABOOF

এই বলে OFS=""আমরা আউটপুট ফিল্ড বিভাজককে খালি স্ট্রিংয়ে সেট করি, যাতে এটি ^সরানো হয়। awk -F"^" '{$1=toupper($1)}1' fileএটির প্রয়োজন না হলে একা এটি তৈরি করত; এটি সমস্তকে ^স্পেসে রূপান্তরিত করে।

নোট করুন আমরা NF>1কমপক্ষে একটি ক্ষেত্রে ক্ষেত্রে উপরের কেস সম্পাদন করতে ব্যবহার করি ^


দেখুন, আপনি মূল পোস্টে একই ভুলগুলি করছেন। এটি দুটি ক্ষেত্রের সাথে কাজ করবে, তবে যদি ফাইলটিতে এমন কিছু থাকে foo^bar^baz? কেবল ক্ষেত্র $ 1 মূলধন হয়ে যায়। এছাড়াও কোনও text সহ পাঠ্য এন্ট্রিগুলি এখনও মূলধন হয়ে যায়।
সের্গেই কোলোডিয়াজনি

@ সার্জ আপনি যদি ^উপস্থিত না হন তবে সমস্ত কিছু মূলধনের জন্য সঠিক regarding আমি শুধু এটি fiexed, ধন্যবাদ। একাধিকটি সম্পর্কে, আমি প্রশ্নটি "প্রথমটি আপের কেস" হিসাবে বুঝতে পারি।
ফেডোরকুই

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

@ সার্গ হ্যাঁ, আমি জানি এবং আমি এটির প্রশংসা করি। কিন্তু এই প্রমানিত হয়েছে জটিল পারেন, আপনি শুধু লুপ করা প্রয়োজন: awk 'BEGIN{FS="^"; OFS=""} NF>1{for (i=0;i<NF;i++) $i=toupper($i)}1' file
ফেডোরকুই 12'15

@ সার্গ, আপনার উত্তরের মন্তব্যগুলি থেকে আমি দেখতে পাচ্ছি আপনি নিজেই শিখছেন। এই অহঙ্কারী কিছুটা আগে আমাকে অনেক সহায়তা করেছিল।
ফেডোরকুই

2

সম্পাদনা

তাই প্রায় দেড় ঘন্টা পরে, আমি এটি নিয়ে এসেছি:

awk -F' ' '{ gsub(/\^/,"@ "); for (i=1;i<=NF;i++){ if($i ~ /\@/) $i = toupper($i);};gsub("@ ","");gsub("@",""); print   }  ' removecharsfile 

প্রাথমিক ধারণা:

  • ^ থেকে মুক্তি পান এবং @ প্লাস স্পেসের সাথে এটি প্রতিস্থাপন করুন
  • ক্ষেত্রের সীমানা হিসাবে স্থানকে আচরণ করুন; এখন আমাদের সাথে খেলতে মাঠ আছে
  • লুপের জন্য প্রতিটি লাইনে প্রতিটি ক্ষেত্রের মধ্য দিয়ে যেতে এবং @ অক্ষর আছে কিনা তা পরীক্ষা করে দেখুন।
  • যদি @ চরিত্রটি থাকে তবে সেই ক্ষেত্রটিকে ওপরে রূপান্তর করুন। কেন $ i = টুপার ($ i)? কারণ অন্যথায় এটি কোথাও সঞ্চিত হয় না
  • লুপটি শেষ হয়ে যাওয়ার পরে @ + স্পেস এবং ক্ষেত্রের শেষে যে কোনও @ পরিত্রাণ পান।
  • সবকিছু মুদ্রণ

এই সমস্তই এক লাইনে লেখার জন্য আরও ভাল পদ্ধতির বিষয়টি এটিকে একটি ফাইলে রাখা (খুব সুন্দরভাবে সংগঠিত বেলো) করা এবং এটিকে এই জাতীয় কাঠের মতো চালানো to awk -f awkscript theinputfile

# awk script to capitalize
# whatever comes before caret(^)


{
  gsub (/\^/, "@ ");
  for (i = 1; i <= NF; i++)
    {
      if ($i ~ /\@/)
        $i = toupper ($i);
    };
  gsub ("@ ", "");
  gsub ("@", "");
  print

}

এবং এখানে এটি কার্যকর হয়:

এখানে চিত্র বর্ণনা লিখুন

মূল পোস্ট

আমি আমার নিজের কোড সংস্করণটিকে অ্যাডকের সাথে অবদান রাখব:

awk -F'^' '{print toupper($1)$2}' thefile

এবং অবশ্যই আপনি এর সাথে আউটপুট পুনর্নির্দেশ করতে পারেন > output.txt এবং এখানে এটি কার্যকর রয়েছে:

এখানে চিত্র বর্ণনা লিখুন


দুর্দান্ত, তবে এটি 2 টিরও বেশি ক্ষেত্রের সাথে ভেঙে যাবে: echo foo^bar^test | awk -F'^' '{print toupper($1)$2}'আউটপুটসFOObar
কোস

1
আপনি যদি "রাবুফ" এর পরে শেষ "^" গ্রহণ করেন, তবে রাবুফ এখনও মূলধন হয়ে যায়
টুক্সফোর্ডলাইফ

নিশ্চিত না যে এটি জরুরী কি না, @ টেক্সফোরলাইফ কি সর্বদা 2 টি ক্ষেত্র আশা করা ভাল?
কোস

1
কখনও কখনও একটি "^" কোনও লাইনে সরবরাহ করা হবে না, সুতরাং সেই ক্ষেত্রে কিছুই হওয়া উচিত নয়। তবে এটি আমার উদাহরণটিতে না দেওয়ার জন্য আমার নিজের দোষ!
টাক্সফোর্ডলাইফ

@TuxForLife আমি উত্তর নেই ক্ষেত্রে অন্তর্ভুক্ত করা "^" উন্নত করতে চেষ্টা করত করতেছি
Sergiy Kolodyazhnyy

2

বাশও এটি করতে পারে, তাই আমি মিশ্রণে একটি ব্যাশ উত্তর নিক্ষেপ করব।

#bash
while IFS= read -r line; do
    if [[ $line = *^* ]]; then
        tmp=${line%%^*} 
        line=${tmp^^}${line#*^}
    fi
    printf '%s\n' "$line"
done < inputfile > outptufile

এটি কেবল ইনপুট ফাইল লাইন-বাই-লাইন ( বাশফিউএকিউ 1 ) এর পুনরাবৃত্তি করছে , এবং বিভাজন এবং বড় হাতের নাটক ( বাশফ্যাক্যাউ 73 ) করার জন্য প্যারামিটার বিস্তৃতি ব্যবহার করছে ।


2

অজগর 3 এর মাধ্যমে,

reমডিউল ব্যবহার না করে ,

with open(file) as f:
    for line in f:
        if '^' in line:
            m = line.strip().split('^')
            print(m[0].upper() + m[1])
        else:
            print(line, end="") 

reমডিউল ব্যবহার করে ।

import re
with open(file) as f:
    for line in f:
        print(re.sub(r'(.*)\^', lambda m: m.group(1).upper(), line.strip()))

fileউপরের স্ক্রিপ্টগুলিকে প্রকৃত ফাইল পাথ দিয়ে প্রতিস্থাপন করুন। এবং python3কমান্ড ব্যবহার করে স্ক্রিপ্টটি চালান ।


1

অন্য একটি awkসংস্করণ:

awk '{ a=$_; ismatch=sub(/\^.*/, "", a); b=gensub(/.*\^(.*)/, "\\1", "", $_); if(ismatch==1) { print toupper(a) b} else { print b} }' testdata

মানব পাঠযোগ্য ;)

awk '{
  a=$_;
  ismatch=sub(/\^.*/, "", a);
  b=gensub(/.*\^(.*)/, "\\1", "", $_);
  if(ismatch==1) {
    print toupper(a) b
  }
  else {
     print b
  }
}' testdata

আমার জন্য একাধিক with সহ এন্ট্রিগুলি, যেমন foo^bar^bazমাঝের অংশটি সরিয়ে FOObaz
ফেলুন

@ সার্জ হুমম ঠিক বলেছেন। আমি আগামীকাল এই পরিবর্তন করব।
এবি

ঠিক আছে, আমাকে যখন পিং?
সের্গেই কোলোডিয়াজনি

1

অন্য pythonপদ্ধতি:

#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
    for line in f:
        if '^' in line:
            index = line.find('^')
            print line[:index].upper() + line[index+1:].rstrip()
        else:
            print line.rstrip()

আউটপুট:

FOObar
BArfoo
oofrab
RABOOF
  • index = line.find('^') চরিত্রের সূচক রয়েছে ^

  • line[:index].upper()সামনে অক্ষর ছাপে index( ^বড় হাতের) ( upper())

  • line[index+1:]^আক্ষরিক পরে অক্ষর মুদ্রণ

  • rstrip()printডিফল্টরূপে যোগ করা ট্রেলিং নতুনলাইনগুলি সরিয়ে ফেলবে ।

সম্পাদনা:

এখন আপনার কাছে যদি এই জাতীয় ফাইল (একাধিক ^) থাকে:

foo^bar^spam
ba^rfoo^egg
oofrab
raboof^spamegg

এবং আপনি এটির মতো করে তৈরি করতে চান:

FOOBARspam
BARFOOegg
oofrab
RABOOFspamegg

এই ক্ষেত্রে আপনি ব্যবহার করতে পারেন:

#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
    for line in f:
        if '^' in line:
            index = line.rfind('^')
            print line[:index].upper().replace('^', '') + line[index+1:].rstrip()
        else:
            print line.rstrip()

আউটপুট:

FOOBARspam
BARFOOegg
oofrab
RABOOFspamegg

rfind('^')পরিবর্তে কেবল প্রতিস্থাপনগুলি হয় find('^'), যা ডানদিকের সূচকটি খুঁজে পাবে ^এবং সমস্তগুলি ফাঁকা দিয়ে replace('^', '')প্রতিস্থাপন করবে ^

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.