আমি কীভাবে একটি স্ট্রিংয়ের সাথে একটি নতুন লাইন রাখতে পারি?


339

এই

STR="Hello\nWorld"
echo $STR

আউটপুট হিসাবে উত্পাদন করে

Hello\nWorld

পরিবর্তে

Hello
World

স্ট্রিংয়ে একটি নতুন লাইন রাখতে আমার কী করা উচিত?

দ্রষ্টব্য: এই প্রশ্নটি প্রতিধ্বনির বিষয়ে নয় । আমি সচেতন আছি echo -e, কিন্তু আমি একটি সমাধান একটি স্ট্রিং একটি আর্গুমেন্ট হিসাবে (যা একটি newline অন্তর্ভুক্ত) পাশ করার অনুমতি দেয় খুঁজছি অন্যান্য কমান্ড যে ব্যাখ্যা করা একটি অনুরূপ বিকল্প নেই \nনতুন লাইন হিসাবে 'র।

উত্তর:


353

সমাধানটি ব্যবহার করা হয় $'string', উদাহরণস্বরূপ:

$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World

বাশ ম্যানুয়াল পৃষ্ঠাটির একটি অংশ এখানে দেওয়া হয়েছে:

   Words of the form $'string' are treated specially.  The word expands to
   string, with backslash-escaped characters replaced as specified by  the
   ANSI  C  standard.  Backslash escape sequences, if present, are decoded
   as follows:
          \a     alert (bell)
          \b     backspace
          \e
          \E     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \"     double quote
          \nnn   the eight-bit character whose value is  the  octal  value
                 nnn (one to three digits)
          \xHH   the  eight-bit  character  whose value is the hexadecimal
                 value HH (one or two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the  dollar  sign  had  not
   been present.

   A double-quoted string preceded by a dollar sign ($"string") will cause
   the string to be translated according to the current  locale.   If  the
   current  locale  is  C  or  POSIX,  the dollar sign is ignored.  If the
   string is translated and replaced, the replacement is double-quoted.

74
এটি বৈধ বাশ, তবে পসিক্স শ নয়।
jmanning2k

7
+ 1-মাত্র একটি নোট: রফতান করুন ভারডিনামিক = "$ varAnother1 $ varAnother2" $ '\ n'
ইওর্ডান জর্জিভ

3
ওপি যেমন জিজ্ঞাসা করেছিল এটি প্রকৃতপক্ষে আক্ষরিক স্ট্রিংগুলির সাথে কাজ করে তবে ভেরিয়েবলগুলি প্রতিস্থাপন করা মাত্রই ব্যর্থ হয়: STR=$"Hello\nWorld"কেবল প্রিন্ট করে Hello\nWorld
এসএসসি

3
@ এসএসসি একক উদ্ধৃতি, দ্বিগুণ নয়
মিকেন 32

7
@ এসএসসি আপনার উদাহরণে কোনও ভেরিয়েবল নেই। এছাড়াও, এই পদ্ধতিতে একক উদ্ধৃতি প্রয়োজন। অবশেষে, ইন্টারপোল্টেড ভেরিয়েবলগুলি অন্তর্ভুক্ত করতে আপনাকে একসাথে ডাবল-কোটেড এবং বিশেষ-একক-উদ্ধৃত স্ট্রিংগুলি সংযুক্ত করতে হবে। উদাহরণস্বরূপ H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"পৃথক লাইনে "হ্যালো" এবং "ওয়ার্ল্ড" প্রতিধ্বনিত হবে
জেডিএস

166

প্রতিধ্বনি এতটা নব্বইয়ের দশকের এবং এত বিপদসঙ্কুল যে এর ব্যবহারের ফলে कोर ডাম্পগুলি 4GB এর চেয়ে কম হবে না no গুরুতরভাবে, প্রতিবেদনের সমস্যাগুলি ইউনিক্স স্ট্যান্ডার্ডাইজেশন প্রক্রিয়া অবশেষে আবিষ্কার করেছিলprintf সমস্ত সমস্যাগুলি সরিয়ে দিয়ে ইউটিলিটি ।

সুতরাং একটি স্ট্রিংয়ে একটি নতুন লাইন পেতে:

FOO="hello
world"
BAR=$(printf "hello\nworld\n") # Alternative; note: final newline is deleted
printf '<%s>\n' "$FOO"
printf '<%s>\n' "$BAR"

সেখানে! কোনও এসওয়াইএসভি বনাম বিএসডি প্রতিধ্বনি পাগল নয়, সবকিছু খুব সুন্দরভাবে মুদ্রিত হয় এবং সি এস্কেপ সিকোয়েন্সগুলির জন্য সম্পূর্ণ পোর্টেবল সমর্থন পায়। প্রত্যেকে printfএখনই ব্যবহার করুন এবং কখনও পিছনে ফিরে তাকাবেন না।


3
এই উত্তরের জন্য ধন্যবাদ, আমি মনে করি এটি সত্যিই ভাল পরামর্শ সরবরাহ করে। নোট, তবে, আমার মূল প্রশ্নটি কীভাবে নিউলাইনগুলি মুদ্রণের জন্য প্রতিধ্বনি পাবেন তা নয়, তবে কীভাবে শেল ভেরিয়েবলের মধ্যে একটি নতুন লাইন পাবেন about আপনি কীভাবে প্রিন্টফ ব্যবহার করে তা করবেন তা দেখান তবে আমি মনে করি যে অ্যাম্ফেটামেকিন ব্যবহার করে সমাধানটি $'string'আরও পরিষ্কার।
জুয়ান এ নাভারো

11
কেবল 'পরিষ্কার' এর ঘাটতি সংজ্ঞার জন্য। $'foo'সিনট্যাক্স 2013 অনেক শাঁস অভিযোগ হবে যেমন বৈধ POSIX সিনট্যাক্স নয়।
জেনস

5
BAR=$(printf "hello\nworld\n")আমার জন্য পেছনের print n প্রিন্ট করে না
জনি

3
@ জনি এটি করা উচিত নয়; কমান্ড প্রতিস্থাপনের জন্য শেল স্পেসিফিকেশন বলে যে আউটপুট শেষে এক বা একাধিক নতুন লাইন মুছে ফেলা হয়। আমি বুঝতে পারি এটি আমার উদাহরণের জন্য অপ্রত্যাশিত এবং প্রিন্টএফটিতে একটি নতুন লাইন অন্তর্ভুক্ত করার জন্য এটি সম্পাদনা করেছে।
জেনস

5
@ ইসমাইল নো, পসিক্স $()দ্বারা প্রতিস্থাপনের শেষে এক বা একাধিক <নিউলাইন> অক্ষরের ক্রম সরিয়ে দেওয়ার জন্য নির্দিষ্ট করা হয়েছে ।
জেনস

61

অন্যান্য উত্তরের ভিত্তিতে আমি যা করেছি তা হ'ল

NEWLINE=$'\n'
my_var="__between eggs and bacon__"
echo "spam${NEWLINE}eggs${my_var}bacon${NEWLINE}knight"

# which outputs:
spam
eggs__between eggs and bacon__bacon
knight

30

সমস্যাটি শেলের সাথে নয়। সমস্যাটি আসলে echoকমান্ড নিজেই এবং ভেরিয়েবল ইন্টারপোলেশনকে ঘিরে ডাবল কোটের অভাব। আপনি ব্যবহার করার চেষ্টা করতে পারেন echo -eতবে এটি সমস্ত প্ল্যাটফর্মগুলিতে সমর্থিত নয় এবং এর অন্যতম কারণprintf এখন বহনযোগ্যতার জন্য প্রস্তাবিত।

আপনি নিজের শেল স্ক্রিপ্টে সরাসরি নতুন লাইনটি সন্নিবেশ করিয়ে দেখতে পারেন (যদি কোনও স্ক্রিপ্ট আপনি যা লিখছেন) তাই দেখে মনে হচ্ছে ...

#!/bin/sh
echo "Hello
World"
#EOF

বা সমতুল্য

#!/bin/sh
string="Hello
World"
echo "$string"  # note double quotes!

24

আমি -eপতাকা মার্জিত এবং সরাসরি এগিয়ে খুঁজে

bash$ STR="Hello\nWorld"

bash$ echo -e $STR
Hello
World

যদি স্ট্রিংটি অন্য কমান্ডের আউটপুট হয় তবে আমি কেবল উদ্ধৃতি ব্যবহার করি

indexes_diff=$(git diff index.yaml)
echo "$indexes_diff"

2
এটি অন্যান্য উত্তরে ইতিমধ্যে উল্লেখ করা হয়েছে। এছাড়াও, যদিও এটি ইতিমধ্যে ছিল, আমি প্রশ্নটি সম্পাদনা করেছি যে এই প্রশ্নটি নয় সে সম্পর্কে চাপ দেওয়ার জন্য echo
জুয়ান এ নাভারো

এটি প্রশ্নের উত্তর নয়
রোহিত গুপ্ত

এটি আমি যে প্রশ্নের সন্ধান করছিলাম তার পুরো উত্তর দেয়! ধন্যবাদ!
কিভেলি

1
এখানে আমার জন্য ভাল কাজ। আমি এই প্রতিধ্বনি উপর ভিত্তি করে একটি ফাইল তৈরি করতে ব্যবহার করেছি এবং এটি আউটপুটে সঠিকভাবে নতুন লাইন তৈরি করেছে।
ম্যাটিউস লিওন

echo -eএটি বহনযোগ্য সমস্যা জন্য কুখ্যাত। এটি প্রাক-পসিক্সের তুলনায় এখন ওয়াইল্ড ওয়েস্ট পরিস্থিতি কম, তবে এখনও পছন্দ করার কোনও কারণ নেই echo -e। আরও দেখুন stackoverflow.com/questions/11530203/...
tripleee

21
  1. একমাত্র সহজ বিকল্পটি হ'ল আসলে ভেরিয়েবেলে একটি নতুন লাইন টাইপ করা:

    $ STR='new
    line'
    $ printf '%s' "$STR"
    new
    line

    হ্যাঁ, এর অর্থ Enterকোডে যেখানে প্রয়োজন সেখানে লেখা ।

  2. একটি new lineচরিত্রের বেশ কয়েকটি সমতুল্য রয়েছে ।

    \n           ### A common way to represent a new line character.
    \012         ### Octal value of a new line character.
    \x0A         ### Hexadecimal value of a new line character.

    তবে তাদের সকলেরই কোনও সরঞ্জাম ( পসিক্স প্রিন্টফ ) দ্বারা "একটি ব্যাখ্যা" প্রয়োজন :

    echo -e "new\nline"           ### on POSIX echo, `-e` is not required.
    printf 'new\nline'            ### Understood by POSIX printf.
    printf 'new\012line'          ### Valid in POSIX printf.
    printf 'new\x0Aline'       
    printf '%b' 'new\0012line'    ### Valid in POSIX printf.

    এবং সেইজন্য, সরঞ্জামটি একটি নতুন-লাইনের সাথে একটি স্ট্রিং তৈরি করা প্রয়োজন:

    $ STR="$(printf 'new\nline')"
    $ printf '%s' "$STR"
    new
    line
  3. কিছু শেলগুলিতে, ক্রমটি $'একটি বিশেষ শেল সম্প্রসারণ। Ksh93, bash এবং zsh এ কাজ করার জন্য পরিচিত:

    $ STR=$'new\nline'
  4. অবশ্যই আরও জটিল সমাধানগুলিও সম্ভব:

    $ echo '6e65770a6c696e650a' | xxd -p -r
    new
    line

    অথবা

    $ echo "new line" | sed 's/ \+/\n/g'
    new
    line

6

একটি ation ঠিক আগে একক উদ্ধৃতি চিহ্ন '... \ n ...' এর ঠিক আগে, তবে ডাবল উদ্ধৃতি চিহ্নগুলি কার্যকর হয় না।

$ echo $'Hello\nWorld'
Hello
World
$ echo $"Hello\nWorld"
Hello\nWorld

4

আমি কোনও বাশ বিশেষজ্ঞ নই, তবে এই একজন আমার পক্ষে কাজ করেছেন:

STR1="Hello"
STR2="World"
NEWSTR=$(cat << EOF
$STR1

$STR2
EOF
)
echo "$NEWSTR"

আমি পাঠ্য ফর্ম্যাট করা সহজ এটি পেয়েছি।


2
ভাল পুরানো বংশগতি । এবং এটি সম্ভবত পজিএক্সও অনুগত!
pyb

কোট প্রায় $NEWSTRমধ্যে echo "$NEWSTR"এখানে গুরুত্বপূর্ণ
দয়া

0

আমার সিস্টেমে (উবুন্টু 17.10) আপনার উদাহরণটি কেবল পছন্দসই হিসাবে কাজ করে, উভয়ই কমান্ড লাইন থেকে টাইপ করার সময় (এতে sh) এবং যখন shস্ক্রিপ্ট হিসাবে কার্যকর করা হয় :

[bash sh
$ STR="Hello\nWorld"
$ echo $STR
Hello
World
$ exit
[bash echo "STR=\"Hello\nWorld\"
> echo \$STR" > test-str.sh
[bash cat test-str.sh 
STR="Hello\nWorld"
echo $STR
[bash sh test-str.sh 
Hello
World

আমি অনুমান করি এটি আপনার প্রশ্নের উত্তর: এটি কেবল কার্যকর। (আমি কী কী মুহুর্তে নিউলাইন চরিত্রের প্রতিস্থাপনটি সঠিকভাবে \nঘটতে পারে তার মতো বিশদ বের করার চেষ্টা করি নিsh )।

যাইহোক, আমি লক্ষ্য করেছি যে এই একই স্ক্রিপ্টটি কার্যকর করারbash সময় অন্যরকম আচরণ করবে এবং Hello\nWorldপরিবর্তে মুদ্রণ করবে :

[bash bash test-str.sh
Hello\nWorld

আমি bashনিম্নলিখিত হিসাবে পছন্দসই আউটপুট পেতে পরিচালিত করেছি :

[bash STR="Hello
> World"
[bash echo "$STR"

চারপাশে ডাবল উদ্ধৃতি নোট করুন $STRbashস্ক্রিপ্ট হিসাবে সংরক্ষণ এবং চালিত হলে এটি অভিন্ন আচরণ করে ।

নিম্নলিখিতটি পছন্দসই আউটপুট দেয়:

[bash echo "Hello
> World"

0

যেসব বাছাইয়ের জন্য কেবল নিউলাইন দরকার এবং মাল্টলাইন কোডটি ঘৃণা করে যা ইনডেন্টেশনটি ভেঙে দেয়, তারা তা করতে পারে:

IFS="$(printf '\nx')"
IFS="${IFS%x}"

কমান্ড প্রতিস্থাপনের পরে বাশ (এবং সম্ভবত অন্যান্য শেলগুলি) সমস্ত চলমান নিউলাইনগুলিকে গাবল করে, সুতরাং আপনার printfস্ট্রিংটি একটি অ-নিউলাইন চরিত্রের সাথে শেষ করতে হবে এবং এটি পরে মুছতে হবে। এটি সহজেই অনলাইনারও হতে পারে।

IFS="$(printf '\nx')" IFS="${IFS%x}"

আমি জানি যে এটির পরিবর্তে এটি দুটি ক্রিয়াকলাপ, তবে আমার ইনডেন্টেশন এবং বহনযোগ্যতা ওসিডি এখন শান্তিতে আছে :) আমি মূলত এটি তৈরি করেছি কেবলমাত্র নতুনরেখা-পৃথক পৃথক আউটপুটকে বিভক্ত করতে সক্ষম হতে এবং আমি একটি পরিবর্তন ব্যবহার করে শেষ করেছি \rযা সমাপ্তি চরিত্র হিসাবে ব্যবহার করে। এটি ডস আউটপুটটি শেষ হওয়ার জন্য এমনকি নতুন লাইনের বিভাজন কাজ করে \r\n

IFS="$(printf '\n\r')"

0

আমি এখানে যে কোনও বিকল্প দিয়ে সত্যই খুশি ছিলাম না। এটিই আমার পক্ষে কাজ করেছিল।

str=$(printf "%s" "first line")
str=$(printf "$str\n%s" "another line")
str=$(printf "$str\n%s" "and another line")

এটি লেখার জন্য অত্যন্ত ক্লান্তিকর উপায় str=$(printf '%s\n' "first line" "another line" "and another line")(শেলটি সুবিধামত (বা না) কমান্ড প্রতিস্থাপন থেকে কোনও চূড়ান্ত নতুন লাইনগুলি ছাঁটাই করবে)। এখানে বেশ কয়েকটি উত্তর ইতিমধ্যে printfবিভিন্ন আকারে প্রচার করেছে যাতে আমি নিশ্চিত নই যে এটি পৃথক উত্তর হিসাবে কোনও মান যুক্ত করে।
ট্রিপলি

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

1
এমনকি দীর্ঘতর স্ট্রিংয়ের জন্যও আমি পছন্দ করি printf '%s\n' "first line" \ (নিউলাইন, ইনডেন্ট) 'second line'ইত্যাদি printf -v strsubs
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.