`সেড` এবং একটি ফাইলের জন্য এখানে-ডক ব্যবহার করা


10

আমি সেড কমান্ডের জন্য একটি এখানে-ডক ব্যবহার করতে চাই এবং পড়ার জন্য ফাইলটি এবং আউটপুট ফাইলটি সরবরাহ করতে চাই।

আমি অ্যাডভান্সড ব্যাশ স্ক্রিপ্টিং গাইড থেকে এখানে-নথির দিকে নজর রেখেছি তবে এটি এখানে-ডক ব্যবহার করার ক্ষেত্রে নিয়মিত যুক্তি সম্পর্কে কিছুই উল্লেখ করে না। এটা কি সম্ভব?

আমি নিম্নলিখিত মত কিছু অর্জন করতে চাই:

#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt

sed $IN << SED_SCRIPT
    s/a/1/g
    s/test/full/g

SED_SCRIPT 
> $OUT;

যেকোনো সাহায্য সত্যি - ই প্রশান্সাযোগ্য।

উত্তর:


14

আপনি জিএনইউ সেডকে স্ট্যান্ডার্ড ইনপুট সহ স্ক্রিপ্টটি পড়তে বলতে পারেন -f -, -fযার অর্থ কোনও ফাইল থেকে স্ক্রিপ্টটি পড়ার -অর্থ এবং প্রচুর কমান্ডের সাথে প্রচলিত সাধারণ স্ট্যান্ডার্ড ইনপুট meaning

sed -f - "$IN" > "$OUT" << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT

পসিক্স সেডও সমর্থন করে -f, তবে -স্ট্যান্ডার্ড ইনপুটটির ব্যবহার নথিভুক্ত নয়। এই ক্ষেত্রে, আপনি /dev/stdinলিনাক্স সিস্টেমে ব্যবহার করতে পারেন (এবং আমি মনে করি সোলারিসের এটিও রয়েছে, তবে আমি এখনই এটি নিশ্চিত করতে পারি না)

<<-SED_SCRIPT('-' উপসর্গ সহ) ব্যবহার SED_SCRIPTকরা বন্ধকরণ ট্যাগকে ইন্ডেন্ট করা যাবে।


আপনাকে ধন্যবাদ, আপনি যা বলেছেন বলেছিলেন, কীভাবে আমি এটি উল্লেখ করতে চাই যে ক্লোজিং টোকেনটি ইন্টেন্ট করা যায় না, অন্যথায় এটি ব্যাশে কোনও ত্রুটি ঘটায়, আমি এটি ধরে নিয়েছি কারণ এটি সমাপ্তির মধ্যে শ্বেত স্থানও অন্তর্ভুক্ত করে।
ত্রিস্টিয়ান

নোট করুন যে অ্যাপল ওএস এক্স সেড স্ট্যান্ডার্ড ইনপুট থেকে কোনও স্ক্রিপ্ট পড়া সমর্থন করে না। (কমপক্ষে সেই পদ্ধতিতে বা অন্য কোনও নথিভুক্ত পদ্ধতিতে নয়))
ড্যানোর্টন

@danorton: আমি একটি যোগ করেছি সমাধান যার সমর্থন প্রয়োজন হয় না -f -sedকিন্তু এটি প্রক্রিয়া প্রতিকল্পন প্রয়োজন: <( command )
পাবউক

5

যদি sedথেকে একটি স্ক্রিপ্টের পড়া সমর্থন করে না stdin(ব্যবহার -f -), আপনি ব্যবহার করতে পারেন প্রক্রিয়া প্রতিকল্পন (উপলব্ধ bash, zsh, ksh93):

sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT)

সমাপনী প্রথম বন্ধনী )অবশ্যই SEC_SCRIPTঅবিলম্বে বা একটি নিউলাইনের পরে শেষ ডিলিমিটারটি অনুসরণ করবে । প্রক্রিয়া প্রতিস্থাপনের ক্ষেত্রে আপনি echoএখানে নথির পরিবর্তে ব্যবহার করতে পারেন :

sed "$IN" > "$OUT" -f <( echo \
"    s/a/1/g
    s/test/full/g" )

1
ম্যাক ওএস এক্স-তে, সেড কমান্ড নিজেই অনুসরণ করে ইনপুট ফাইলটি ( "$IN"বা এমনকি testfile.txt) পছন্দ করে নি - এটি একটি -e scriptবা চেয়েছিল -f file। @ পাবউকের উত্তর পুনরায় সাজানো আমার পক্ষে কাজ করেছে:sed -f <( cat << ETC ... ETC) "$IN" > "$OUT"
স্টিফেন পি

ম্যাক্স ওএসএক্সে ব্যাশ ৪.২.৪৫ এবং স্ট্যান্ডার্ড বিএসডি সেড সহ ক্লোজিং বন্ধনীগুলি বন্ধের নীচে একটি নতুন লাইনে থাকতে হবে SED_SCRIPT
আলেকজান্ডার ক্লিমেটসেক

-1

সম্ভবত একটি ভাল পদ্ধতির:

OUT=/dev/stdout

IN=my_in_file.txt
sed -s 's/in/out/' < $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT < $IN

IN=my_in_text
sed -s 's/in/out/' <<< $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT <<< $IN

:)


1
আকর্ষণীয়, তবে বিষয়টি ছাড়াও। ওপি স্টিডিনের মাধ্যমে সেড কমান্ডগুলি পাস করতে চায়।
মুরু

এই পদ্ধতির উভয় পদ্ধতি অনুমতি দেয়, কেন ডাউনটোট?
ম্যাগনাস

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