বাশে কোনও স্ট্রিং থেকে কীভাবে একটি নিউলাইন সরানো যায়


110

আমি নিম্নলিখিত পরিবর্তনশীল আছে।

echo "|$COMMAND|"

যা ফিরে আসে

|
REBOOT|

কীভাবে আমি প্রথম নিউলাইনটি সরিয়ে ফেলব?


7
কেন এটি ডুপ হিসাবে চিহ্নিত করা হয়েছে? এই প্রশ্নটি একটি গাড়ীর রিটার্ন অপসারণ সম্পর্কে। কথিত সদৃশ প্রশ্নের সাথে এটির লিঙ্কটি হ'ল সাদা স্থান সরিয়ে দেওয়ার বিষয়ে, এবং কেবল ঘটনাক্রমে গাড়ীর ফেরতের উল্লেখ রয়েছে।
মাইকেল শ্যাপার

1
@ মিশেলশেপার সম্মত হয়েছে এবং আবার খোলা হয়েছে।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

এখানে পরিভাষাটি বিজোড়। ইউনিক্স লাইন-সমাপ্তি অক্ষর \n(hex 0x0A) কে মিথ্যা ফিড (এলএফ) বলা হয়; এটি অক্ষর ক্যারিজ রিটার্ন (সিআর) \r(হেক্স 0x0 ডি) থেকে পৃথক, যা উইন্ডোজ এবং অনেক নেটওয়ার্ক প্রোটোকলে দুটি বাইট লাইন-সমাপ্তি ক্রম সিআর এলএফের প্রথম বাইট হিসাবে ব্যবহৃত হয়।
ট্রিপলি

উত্তর:


114

অধীনে , কিছু বাশিজম রয়েছে:

trকমান্ড দ্বারা প্রতিস্থাপিত হতে পারে // bashism :

COMMAND=$'\nREBOOT\r   \n'
echo "|${COMMAND}|"
|
   OOT
|

echo "|${COMMAND//[$'\t\r\n']}|"
|REBOOT   |

echo "|${COMMAND//[$'\t\r\n ']}|"
|REBOOT|

বাশের ম্যান পৃষ্ঠাতে প্যারামিটার সম্প্রসারণ এবং উদ্ধৃতি দেখুন :

man -Pless\ +/\/pattern bash
man -Pless\ +/\\\'string\\\' bash

man -Pless\ +/^\\\ *Parameter\\\ Exp bash
man -Pless\ +/^\\\ *QUOTING bash

আরও ...

@ অ্যালেক্সজার্ডানের অনুরোধ অনুসারে এটি নির্দিষ্ট করা সমস্ত অক্ষরকে দমন করবে । তাইলে যদি $COMMANDস্পেস থাকে ...

COMMAND=$'         \n        RE BOOT      \r           \n'
echo "|$COMMAND|"
|
           BOOT      
|

CLEANED=${COMMAND//[$'\t\r\n']}
echo "|$CLEANED|"
|                 RE BOOT                 |

shopt -q extglob || { echo "Set shell option 'extglob' on.";shopt -s extglob;}

CLEANED=${CLEANED%%*( )}
echo "|$CLEANED|"
|                 RE BOOT|

CLEANED=${CLEANED##*( )}
echo "|$CLEANED|"
|RE BOOT|

কিছুদিন:

COMMAND=$'         \n        RE BOOT      \r           \n'
CLEANED=${COMMAND//[$'\t\r\n']} && CLEANED=${CLEANED%%*( )}
echo "|${CLEANED##*( )}|"
|RE BOOT|

বিঃদ্রঃ: আছে extglobবিকল্প সক্রিয় করা ( shopt -s extglobব্যবহার করা) অনুক্রমে *(...)সিনট্যাক্স।


1
এটি BASH এর একটি ভেরিয়েবল থেকে লাইনফিডগুলি ফেলার উপায়। অন্যান্য উত্তরগুলি অযথা অতিরিক্ত টিআর প্রক্রিয়া শুরু করছে। বিটিডাব্লু, এর শেষ স্থানগুলি সরানোর অতিরিক্ত সুবিধা রয়েছে!
ingyhere

1
নোট করুন যে এটি স্ট্রিং থেকে অভ্যন্তরীণ স্পেসগুলিও সরিয়ে দেয় ... COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n ']}|"ফিরে আসে|REBOOT|
অ্যালেক্স জর্ডান

2
@ অ্যালেক্সজর্ডান হ্যাঁ, এটি একটি পছন্দসই বৈশিষ্ট্য : এটি \nপ্রতিরোধের জন্য আপনি স্থানটি চাবুক দিয়ে দিতে COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n']}|"পারেন : ফিরে আসবে |RE BOOT|
এফ। হাউরি

2
প্যাটার্নটি কীভাবে কাজ করছে ${COMMAND//[$'\t\r\n']}? আমি ভেবেছিলাম ${COMMAND//[\t\r\n]}সহজভাবে কাজ করবে, তবে তা হয়নি। কি $জন্য এবং খুব একক উদ্ধৃতি চিহ্ন?
হরিদসভ

1
Synt '' সিনট্যাক্স সম্পর্কিত, এটি এএনএসআই সি উদ্ধৃতি (উইজর্ডানদের উত্তরে উল্লিখিত)।
ছাক্স

81
echo "|$COMMAND|"|tr '\n' ' '

নতুন স্থানটি (পসিক্স / ইউনিক্সে এটি ক্যারিজ রিটার্ন নয়) প্রতিস্থাপন করবে।

সত্যি কথা বলতে আমি বাশ থেকে আরও বুদ্ধিমান কিছুতে সরে যাওয়ার বিষয়ে ভাবব। বা এই জায়গাটিতে এই বিকৃত ডেটা তৈরি করা এড়ানো gene

হুম, এটি কোথা থেকে ডেটা আসছে তা নির্ভর করে এটি একটি ভয়ঙ্কর সুরক্ষা গর্ত হতে পারে বলে মনে হচ্ছে।


তারিখটি একই সার্ভারে থাকা কার্ল অনুরোধ থেকে আসছে, আমি কীভাবে এটি একটি নতুন ভারে স্থাপন করব? newvar = $ (প্রতিধ্বনি "| M কমান্ড |" | ট্র '\ n' '')
ম্যাট লেল্যান্ড

2
হ্যাঁ. তবে দয়া করে আমাকে বলুন যে আপনি স্বেচ্ছাচারী লোককে পাসওয়ার্ড ছাড়াই দূরবর্তীভাবে আপনার সার্ভারটি রিবুট করার অনুমতি দিচ্ছেন না ...
রবিন গ্রীন

31
আপনি কোনও স্থান পরিবর্তনের পরিবর্তে ড্রপিংয়েরtr -d '\n' জন্য কেন ব্যবহার করলেন না
এফ। হাউরি

3
অকেজো পাইপ চাবুক দয়া করে! tr '\n' ' ' <<< "|$COMMAND|"পরিবর্তে ব্যবহার করুনecho ... | ...
এফ। হুরি

12
@ এফ.হৌরি: বা অকেজো টিআর এর:"|${COMMAND//$'\n'}|"
ধনী 18

75

সমস্ত গাড়ীর রিটার্ন অপসারণ করে আপনার পরিবর্তনশীল পরিষ্কার করুন:

COMMAND=$(echo $COMMAND|tr -d '\n')

22
যে স্ট্রিপ লাইনফিড না? tr -d '\r'পরিবর্তে এটি করা উচিত নয় ?
ইজজি

3
একটি অসংরক্ষিত ভেরিয়েবল প্রতিধ্বনি করা সমস্ত আইএফএস অক্ষর মুছে ফেলে (নতুন লাইন, স্থান, ট্যাব ডিফল্টরূপে)। সুতরাং আপনি যদি এটি করতে যাচ্ছেন তবে আপনার সচেতন হওয়া উচিত যে সমস্ত আইএফএস অক্ষর বাদ পড়েছে এবং আপনার প্রয়োজন নেই tr। কেবল COMMAND=$(echo $COMMAND)একটি অনুরূপ প্রভাব দেবে। কোনটি সম্ভবত, শয়তান একটি নতুন প্রক্রিয়া ডেকে এনেছে, তবে এটি মানুষের চোখের জন্য এখনও খুব সংক্ষিপ্ত এবং মিষ্টি এবং যদি আপনার জীবনে এক বা দুটি বাঁচার জন্য থাকে তবে আপনি হিট নিতে রাজি হতে পারেন :-)।
মাইক এস

আমি "লাইনফিড" বলার জন্য প্রশ্নটি আপডেট করেছি, যেমন এর উদাহরণটি দেখিয়েছিল যে এটি কোনও লাইনফিড ছিল, কোনও গাড়ীর রিটার্ন নয়। এই উত্তরটি এখনও সঠিক, তবে সম্ভবত "ক্যারেজ রিটার্ন" পরিবর্তে "লাইনফিড" বলতে আপডেট করা উচিত?
বেনজামিন ডাব্লু।

8

ব্যবহার bash:

echo "|${COMMAND/$'\n'}|"

(দ্রষ্টব্য যে এই প্রশ্নের নিয়ন্ত্রণের অক্ষরটি 'নিউলাইন' ( \n), ক্যারিজ রিটার্ন নয় \r)); পরবর্তীটির REBOOT|একক লাইনে আউটপুট থাকবে )

ব্যাখ্যা

ব্যাশ শেল প্যারামিটার সম্প্রসারণ ব্যবহার করে ${parameter/pattern/string}:

প্যাটার্ন ঠিক ফাইলের নাম সম্প্রসারণ হিসেবে একটি প্যাটার্ন উত্পাদন করতে প্রসারিত করা হয়। প্যারামিটারটি প্রসারিত করা হয় এবং এর মানটির সাথে প্যাটার্নের দীর্ঘতম মিলটি স্ট্রিংয়ের সাথে প্রতিস্থাপিত হয় । [...] স্ট্রিং যদি নাল হয় তবে প্যাটার্নের ম্যাচগুলি মুছে ফেলা হয় এবং / নিম্নলিখিত প্যাটার্নটি বাদ দেওয়া যেতে পারে।

$'' এএনএসআই-সি উদ্ধৃতি রচনাটি একটি নতুন লাইন হিসাবে নির্দিষ্ট করতে ব্যবহার করে $'\n'। একটি নতুন লাইন সরাসরি ব্যবহার পাশাপাশি কাজ করবে, যদিও কম সুন্দর:

echo "|${COMMAND/
}|"

পুরো উদাহরণ

#!/bin/bash
COMMAND="$'\n'REBOOT"
echo "|${COMMAND/$'\n'}|"
# Outputs |REBOOT|

অথবা, নিউলাইনগুলি ব্যবহার করে:

#!/bin/bash
COMMAND="
REBOOT"
echo "|${COMMAND/
}|"
# Outputs |REBOOT|

6

আমার জন্য যা কাজ ছিল তা ছিল echo $testVar | tr "\n" " "

যেখানে টেস্টবারে আমার চলক / স্ক্রিপ্ট-আউটপুট থাকে


4

Using r টিআর ব্যবহার করে এবং সেড ব্যবহার করে একাধিক অক্ষর কেটে ফেলার উদাহরণ দেখানোর জন্য উত্তর যুক্ত করা। এবং হেক্সডাম্প ব্যবহার করে চিত্রণ।

আমার ক্ষেত্রে আমি খুঁজে পেয়েছিলাম যে একটি কমান্ড শেষ আইটেমের awk মুদ্রণের সাথে শেষ হয় |awk '{print $2}' লাইনের মধ্যে একটি ক্যারেজ-রিটার্ন \ r পাশাপাশি উদ্ধৃতি অন্তর্ভুক্ত রয়েছে।

আমি ব্যবহার করতাম sed 's/["\n\r]//g' উভয়ই গাড়িবহর-রিটার্ন এবং উদ্ধৃতিগুলি কেটে ফেলতাম।

আমিও ব্যবহার করতে পারতাম tr -d '"\r\n'

sed -zযদি কেউ line n লাইন-ফিড অক্ষর অপসারণ করতে চায় তবে খেয়াল করার জন্য আকর্ষণীয় প্রয়োজন।

$ COMMAND=$'\n"REBOOT"\r   \n'

$ echo "$COMMAND" |hexdump -C
00000000  0a 22 52 45 42 4f 4f 54  22 0d 20 20 20 0a 0a     |."REBOOT".   ..|

$ echo "$COMMAND" |tr -d '"\r\n' |hexdump -C
00000000  52 45 42 4f 4f 54 20 20  20                       |REBOOT   |

$ echo "$COMMAND" |sed 's/["\n\r]//g' |hexdump -C
00000000  0a 52 45 42 4f 4f 54 20  20 20 0a 0a              |.REBOOT   ..|

$ echo "$COMMAND" |sed -z 's/["\n\r]//g' |hexdump -C
00000000  52 45 42 4f 4f 54 20 20  20                       |REBOOT   |

এবং এটি প্রাসঙ্গিক: ক্যারেজ রিটার্ন, লাইনফিড এবং ফর্ম ফিড কী?

  • সিআর == \ আর == 0x0 দিন
  • এলএফ == \ n == 0x0a


2

যদি আপনি এক্সটগ্লোব বিকল্পটি সক্ষম করে ব্যাশ ব্যবহার করে থাকেন তবে আপনি কেবল অনুসরণের শ্বেত স্পেসটি এর মাধ্যমে সরাতে পারবেন:

shopt -s extglob
COMMAND=$'\nRE BOOT\r   \n'
echo "|${COMMAND%%*([$'\t\r\n '])}|"

এই ফলাফলগুলি:

|
RE BOOT|

বা কেবল% নেতৃস্থানীয় শ্বেতস্থান প্রতিস্থাপন করতে ## দিয়ে %% প্রতিস্থাপন করুন।


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