কিভাবে স্টিডিন এবং একটি স্ট্রিং সংযুক্ত করতে?


108

আমি স্ট্রিনকে এভাবে স্ট্রিংতে কীভাবে যুক্ত করব?

echo "input" | COMMAND "string"

এবং পেতে

inputstring

উত্তর:


119

একটি হল hacky বিট, কিন্তু এই কি আপনি প্রশ্ন (স্বীকার করতে একটি নল ব্যবহার জিজ্ঞাসা করতে সংক্ষিপ্ত রাস্তা হতে পারে stdoutথেকে echo "input"যেমন stdinঅন্য প্রক্রিয়া / কমান্ড:

echo "input" | awk '{print $1"string"}'

আউটপুট:

inputstring

আপনি কোন কাজটি সঠিকভাবে সম্পাদন করার চেষ্টা করছেন? আরও প্রসঙ্গ আপনাকে আরও ভাল সমাধানের জন্য আরও দিকনির্দেশ দিতে পারে।

আপডেট - মন্তব্য প্রতিক্রিয়া:

@NoamRoss

আপনি যা চান তার করার আরও বুদ্ধিমানের পদ্ধতিটি হ'ল:

echo 'http://dx.doi.org/'"$(pbpaste)"

$(...)সিনট্যাক্স বলা হয় কমান্ড প্রতিকল্পন । সংক্ষেপে, এটি একটি নতুন সাবশেলে সংযুক্ত কমান্ডগুলি সম্পাদন করে এবং এর stdoutআউটপুটটিকে $(...)প্যারেন্ট শেলটিতে যেখানে ডাকা হয়েছিল সেখানে প্রতিস্থাপন করে । সুতরাং আপনি কার্যকরভাবে পাবেন:

echo 'http://dx.doi.org/'"rsif.2012.0125"

1
ধন্যবাদ! এটি দুর্দান্ত কাজ করে। আমি যে সঠিক কাজটি সম্পাদন করতে চাইছি তা হ'ল ক্লিপবোর্ড (একটি ডিওআই) থেকে একটি স্ট্রিং নেওয়া এবং এটিতে একটি ইউআরএল প্রস্তুত করা, তাই এটি দিয়ে আমি তা করি pbpaste | awk '{print "http://dx.doi.org/"$1}'এবং পানhttp://dx.doi.org/10.1098/rsif.2012.0125
Noam Ross

5
@ সাম্পসন-চেন, আমি '{print $0"string"}'পুরো জিনিসটি দখল করতে ব্যবহার করব ।
রোমান নেওয়াজা

3
এটি আসলে stringপ্রতিটি লাইনে যুক্ত হয়। ব্যবহার করে দেখুন echo 'input'\n'another line' | awk '{print $0"string"}'
টোমেকভি

55

cat -স্টিডিনের কাছ থেকে পড়তে ব্যবহার করুন এবং এটিকে $()পিছনের নতুন লাইনে ফেলে দেওয়ার জন্য রাখুন

echo input | COMMAND "$(cat -)string"

তবে কেন আপনি পাইপটি ফেলে দেন এবং বাম পাশের আউটপুটটি কোনও কমান্ড প্রতিস্থাপনে গ্রহন করবেন না:

COMMAND "$(echo input)string"

1
এখানে একটি ব্যবহারিক উদাহরণ: সন্ধান করুন ~ / অন্যান্য_প্রগ্রাম / লাইব-নাম "* .jar" | tr '। n' ':' | প্রতিধ্বনি "$ (বিড়াল -) ~ / জাভা_্যাপ / ক্লাস"
আশ্বিন জয়প্রকাশ

2
এটি আমার জন্য ব্যাশে কাজ করে তবে zsh এ আমি "বিড়াল: -: ইনপুট / আউটপুট ত্রুটি" পাই। কোন ধারণা কি এই হতে পারে?
জায়েমার - মনিকা পুনরায় ইনস্টল করুন

"কম্যান্ড" হ'ল সমাধান এবং আরও কিছু জটিল প্রক্রিয়ার জন্য "প্রতিধ্বনি ইনপুট"। "-" ক্যাট বিড়ালটি কেবল তখনই অন্য ফাইল ফাইল হয় তবে অন্যথায় এটি ডিফল্ট হয়। সুতরাং আপনি যা বোঝাতে চেয়েছিলেন তা ছিল: প্রতিধ্বনি ইনপুট | প্রতিধ্বনি cat (বিড়াল) স্ট্রিং
ডেনিস হাও

46

আমি প্রায়শই পাইপ ব্যবহার করি তাই এটি উপসর্গ এবং প্রত্যয় স্টিডিনের সহজ উপায় হতে পারে:

echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix

2
ধন্যবাদ! এটি ব্যবহারের প্রকৃতপক্ষে খুব দুর্দান্ত উদাহরণ pipeএবংcat
অ্যালেক্স আইভ্যাসিভ

1
এটি সেরা উত্তর হওয়া উচিত
ক্রিস কোস্টন

1
কেন শুধু শুধু: echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"? বা, আরও পঠনযোগ্য সংস্করণ:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
মিনিম্যাক্স

1
@ মিনিম্যাক্স কারণ উত্তরটি স্ট্রিমগুলির সাথে ভালভাবে কাজ করে, এটি বড় স্টিডিনের জন্য কাজ করবে।
আনিশপেটেল

1
@નિশপ্যাটেল আমার সংস্করণটি বড় স্টিডিনের জন্যও কাজ করবে। কোনও পার্থক্য নেই।
মিনিম্যাক্স


9

এটি সম্পাদন করার কয়েকটি উপায় রয়েছে, আমি ব্যক্তিগতভাবে সর্বোত্তম বলে মনে করি:

echo input | while read line; do echo $line string; done

আর একটি হতে পারে একটি সেড কমান্ডে "স্ট্রিং" দিয়ে "$" (রেখার অক্ষরের শেষ) প্রতিস্থাপনের মাধ্যমে:

echo input | sed "s/$/ string/g"

আমি কেন আগের পছন্দ? কারণ এটি তাত্ক্ষণিকভাবে স্ট্রিনের সাথে একটি স্ট্রিং যুক্ত করে, উদাহরণস্বরূপ নিম্নলিখিত কমান্ডের সাহায্যে:

(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done

আপনি তাত্ক্ষণিকভাবে প্রথম আউটপুট পাবেন:

input_one string

এবং তারপরে 5 সেকেন্ড পরে আপনি অন্য প্রতিধ্বনি পাবেন:

input_two string

অন্যদিকে "সেড" ব্যবহার করে প্রথমে এটি প্রথম বন্ধনীর সমস্ত বিষয়বস্তু সম্পাদন করে এবং তারপরে এটি "সেড" এ দেয়, সুতরাং আদেশটি

(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"

উভয় লাইন আউটপুট হবে

input_one string
input_two string

5 সেকেন্ড পরে।

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


আসলে, সেড অপশনটি তাত্ক্ষণিকভাবে প্রতিটি লাইন ইনপুট প্রসেস করে।
টমেকভি

একক লাইন ইনপুটটির জন্য, সহজ সমাধান হ'ল ইকো ইনপুট | (পড়ুন ভি; প্রতিধ্বনি $ {v} স্ট্রিং) এটি খাঁটি শেল তাই সেডের মতো কোনও অতিরিক্ত প্রক্রিয়া প্রয়োজন না।
ডেনিস হা

7

আমি জানি এটি কয়েক বছর দেরিতে হয়েছে, তবে আপনি এটিটি xargs -J বিকল্পের সাহায্যে সম্পন্ন করতে পারেন:

echo "input" | xargs -J "%" echo "%" "string"

আর যেহেতু এটি হল xargs, আপনি এই একটি ফাইলের একাধিক লাইনে একযোগে কাজ করতে পারেন। যদি ফাইলের নামগুলির তিনটি লাইন থাকে তবে:

Adam
Bob
Charlie

আপনি করতে পারেন:

cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"

1
দেখতে দেখতে দুর্দান্ত লাগছে তবে -Jসাধারণ / সাধারণ বলে মনে হচ্ছে না। লিনাক্সে (যেখানে xargsঅংশ রয়েছে GNU findutils) আমি ত্রুটি পেয়েছি: এটি xargs: invalid option -- 'J'কোন সিস্টেমে চালু আছে?
আরিফুল

3
-Jম্যাক সংস্করণ জন্য। লিনাক্সের -Iজন্য একই ফাংশন সম্পাদন করে।
ব্যবহারকারী 2635263

1
ধন্যবাদ! খুব দরকারী. দয়া করে নোট করুন যে লিনাক্সে, এই সরলীকৃত সংস্করণটি ঠিক একইভাবে কাজ করে: cat names | xargs -I% echo "I like % because he is nice"আইওডাব্লু: -n 1( xargsইনপুটটির echoপ্রতি লাইন একবারে কল করার প্রয়োজন নেই , যেহেতু -Iবোঝা যাচ্ছে -L1) এছাড়াও, সমস্ত পৃথক আর্গ উদ্ধৃতিটি অপ্রয়োজনীয় বলে মনে হয়।
আরিফ

3

আপনার পোস্ট করা কমান্ডটি "ইনপুট" স্ট্রিংটি COMMAND এর স্টিডিন স্ট্রিম হিসাবে গ্রহণ করবে, যা আপনি অনুসন্ধান করছেন এমন ফলাফল আনবে না যতক্ষণ না কমমান প্রথমে তার স্টিডিনের বিষয়বস্তু প্রিন্ট করে এবং তারপরে তার কমান্ড লাইন আর্গুমেন্টটি প্রিন্ট করে না।

দেখে মনে হচ্ছে আপনি যা করতে চান তা হ'ল কমান্ড প্রতিস্থাপনের আরও কাছাকাছি।

http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

কমান্ড প্রতিস্থাপনের সাথে আপনার এই জাতীয় কমান্ডলাইন থাকতে পারে:

echo input `COMMAND "string"`

এটি প্রথমে ইনপুট হিসাবে "স্ট্রিং" দিয়ে কম্যান্ডের মূল্যায়ন করবে এবং তারপরে '`' অক্ষরের মধ্যে কী রয়েছে তা প্রতিস্থাপন করে সেই কমান্ডের মৃত্যুদণ্ডের ফলাফলকে একটি লাইনে প্রসারিত করবে।


এবং অবশ্যই @ নাওমরোস, যদি না আপনি বোর্ন শেল ব্যবহার করতে বা অন্য ক্রেজি "পোর্টেবিলিটি" ম্যান্ডেট echo input $(COMMAND "string")না পান তবে আপনি ব্যাকটিক্সের পরিবর্তে আধুনিক কমান্ডের বিকল্প ব্যবহার করবেন । সবার জন্য শুভ কামনা.
শেল্টার

1

বিড়াল আমার পছন্দ হবে: ls | cat - <(echo new line)


সেড একটি লাইন ভিত্তিক কমান্ড যা আপস্ট্রিম
পাইপটির

0

এছাড়াও কাজ করে:

seq -w 0 100 | xargs -I {} echo "string "{}

এর মতো স্ট্রিং উত্পন্ন করবে:

string 000
string 001
string 002
string 003
string 004

...

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