কিছু আউটপুটের প্রতিটি লাইন থেকে আমি কীভাবে শীর্ষস্থানীয় এবং অনুসরণ করা সাদা স্থান ট্রিম করব?


153

আমি একটি আউটপুটে প্রতিটি লাইন থেকে সমস্ত নেতৃস্থানীয় এবং অনুসরণযোগ্য স্পেস এবং ট্যাবগুলি সরাতে চাই।

trimআমি কি আমার আউটপুটটি পাইপ করতে পারি তার মতো কোনও সাধারণ সরঞ্জাম আছে ?

উদাহরণ ফাইল:

test space at back 
 test space at front
TAB at end  
    TAB at front
sequence of some    space in the middle
some empty lines with differing TABS and spaces:





 test space at both ends 

1
যে কেউ নিউলাইনগুলি সরানোর সমাধানের জন্য এখানে খুঁজছেন তাদের পক্ষে, এটি একটি ভিন্ন সমস্যা। সংজ্ঞা অনুসারে একটি নতুন লাইন পাঠ্যের একটি নতুন লাইন তৈরি করে। সুতরাং পাঠ্যের একটি লাইনে একটি নতুন লাইন থাকতে পারে না। : প্রশ্ন জিজ্ঞাসা করতে চান সূচনা অথবা একজন স্ট্রিংয়ের শেষ প্রান্ত থেকে একটি newline মুছে ফেলার জন্য কিভাবে stackoverflow.com/questions/369758 , অথবা ফাঁকা লাইন বা লাইন যে শুধু হোয়াইটস্পেস হয় অপসারণ কিভাবে: serverfault.com/questions/252921
টনি

উত্তর:


198
awk '{$1=$1;print}'

বা সংক্ষিপ্ত:

awk '{$1=$1};1'

সামনের এবং পিছনের স্থান বা ট্যাবে অক্ষর ছাঁটা হবে 1 এবং একটি একক মহাকাশ ট্যাব এবং স্পেস ক্রমের সাথে আলিঙ্গন।

এটি কাজ করে কারণ আপনি যখন কোনও একটি ক্ষেত্রে কিছু বরাদ্দ করেন , সমস্ত ক্ষেত্রের ( , ..., ) সাথে (ডিফল্টরূপে) যোগদান awkকরে পুরো রেকর্ডটি পুনর্নির্মাণ করে (দ্বারা মুদ্রিত )।print$1$NFOFS

1 (এবং সম্ভবত অন্যান্য ফাঁকা অক্ষর লোকেল এবং awkপ্রয়োগের উপর নির্ভর করে )


2
দ্বিতীয় উদাহরণে সেমিকোলন অতিমাত্রায় হয়। ব্যবহার করতে পারে:awk '{$1=$1}1'
ব্রায়ান


আকর্ষণীয় ... কোনও সেমিকোলন গাক, মাক এবং ওএস এক্স এর অ্যাজকে সমর্থন করে না। (কমপক্ষে আমার সংস্করণগুলির জন্য (যথাক্রমে 1.2, 4.1.1 এবং 20070501))
ব্রায়ান

1
এই পদ্ধতির বিষয়ে আমি কেবল পছন্দ করি না তা হ'ল আপনি লাইনের মধ্যে পুনরাবৃত্তি করার জায়গা হারাবেন। উদাহরণস্বরূপ,echo -e 'foo \t bar' | awk '{$1=$1};1'
User.friendly

2
echo ' hello ' | xargs
জেরম

43

আপনি জিএনইউ ব্যবহার করলে কমান্ডটি তেমনভাবে ঘনীভূত হতে পারে sed:

$ sed 's/^[ \t]*//;s/[ \t]*$//' < file

উদাহরণ

কর্মের উপরের কমান্ডটি এখানে।

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
blahblah

আপনি hexdumpনিশ্চিত করতে ব্যবহার করতে পারেন যে sedকমান্ডটি পছন্দসই অক্ষরগুলি সঠিকভাবে সরিয়ে ফেলছে।

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//' | hexdump -C
00000000  62 6c 61 68 62 6c 61 68  0a                       |blahblah.|
00000009

চরিত্রের ক্লাস

আপনি আক্ষরিকভাবে এই জাতীয় সেটগুলি তালিকাভুক্ত করার পরিবর্তে অক্ষর শ্রেণীর নামগুলিও ব্যবহার করতে পারেন [ \t]:

$ sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' < file

উদাহরণ

$ echo -e " \t   blahblah  \t  " | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'

নিয়মিত এক্সপ্রেশন (রেজেক্স) ব্যবহার করে এমন বেশিরভাগ জিএনইউ সরঞ্জাম এই ক্লাসগুলিকে সমর্থন করে।

 [[:alnum:]]  - [A-Za-z0-9]     Alphanumeric characters
 [[:alpha:]]  - [A-Za-z]        Alphabetic characters
 [[:blank:]]  - [ \x09]         Space or tab characters only
 [[:cntrl:]]  - [\x00-\x19\x7F] Control characters
 [[:digit:]]  - [0-9]           Numeric characters
 [[:graph:]]  - [!-~]           Printable and visible characters
 [[:lower:]]  - [a-z]           Lower-case alphabetic characters
 [[:print:]]  - [ -~]           Printable (non-Control) characters
 [[:punct:]]  - [!-/:-@[-`{-~]  Punctuation characters
 [[:space:]]  - [ \t\v\f]       All whitespace chars
 [[:upper:]]  - [A-Z]           Upper-case alphabetic characters
 [[:xdigit:]] - [0-9a-fA-F]     Hexadecimal digit characters

আক্ষরিক সেটগুলির পরিবর্তে এগুলি ব্যবহার করা সর্বদা জায়গার অপচয় হিসাবে মনে হয় তবে আপনি যদি নিজের কোডটি বহনযোগ্য বলে বিবেচনা করেন বা বিকল্প চরিত্র সেটগুলি (আন্তর্জাতিক মনে করেন) নিয়ে কাজ করে থাকেন তবে আপনি সম্ভবত শ্রেণীর নামগুলি ব্যবহার করতে চাইবেন পরিবর্তে.

তথ্যসূত্র


নোট যেটি সাধারণ ক্ষেত্রে (ইউনিকোড ইত্যাদি) এর [[:space:]]সমতুল্য নয় [ \t][[:space:]]সম্ভবত অনেক ধীর হবে (যেমন ইউনিকোডে কেবল ' 'এবং এর চেয়ে অনেক বেশি ধরণের স্পেসস্পেস রয়েছে '\t') অন্য সকলের জন্য একই জিনিস।
অলিভিয়ার ডুলাক

sed 's/^[ \t]*//'বহনযোগ্য নয়। অবশেষে পসিক্স এমনকি এমনও প্রয়োজন যে স্থান, ব্যাকস্ল্যাশ বা tঅক্ষরগুলির ক্রম সরিয়ে ফেলতে হবে এবং পরিবেশে থাকা sedঅবস্থায় জিএনইউ এটিও করে POSIXLY_CORRECT
স্টাফেন চেজেলাস

আমি যদি নতুন লাইনের চরিত্রগুলি ছাঁটাই করতে চাই তবে কী হবে? '\ n \ n পাঠ্য \ n \ n'
ইউজিন বিরিয়ুকভ

আমি অ্যাড সলিউশন হিসাবে অন্যান্য পার্শ্ব-প্রভাবের অভাবের কারণে সেড সমাধানটি পছন্দ করি। আমি এখন ওএসএক্স jsut এ ব্যাশে চেষ্টা করলে প্রথম প্রকরণটি কার্যকর হয় না, তবে চরিত্রের শ্রেণি সংস্করণটি কাজ করে:sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'
টনি

@ ইউজেনবিরিয়োকভ মূল পোস্টটি সম্পর্কে আমার মন্তব্য দেখুন
টনি

23

গৃহীত উত্তরে স্টাফেন চেজেলাসের পরামর্শ অনুসারে , আপনি এখন
একটি স্ক্রিপ্ট তৈরি করতে পারেন /usr/local/bin/trim:

#!/bin/bash
awk '{$1=$1};1'

এবং সেই ফাইলটিকে সম্পাদনযোগ্য অধিকার দিন:

chmod +x /usr/local/bin/trim

এখন আপনি প্রতিটি আউটপুট trimউদাহরণস্বরূপ পাস করতে পারেন :

cat file | trim

(নীচের মন্তব্যের জন্য: আমি এটি আগে ব্যবহার করেছি: while read i; do echo "$i"; done
এটিও ভাল কাজ করে তবে কম পারফরম্যান্ট)


1
আপনার ফাইল বিশাল এবং / অথবা ব্যাকস্ল্যাশগুলি থাকে তবে ভাগ্য ভাল।
don_crissti

1
@ ডন_ক্রিসটি: আপনি কি আরও কিছু মন্তব্য করতে পারেন ?, বিশাল ফাইলগুলির জন্য কোন সমাধানটি আরও ভাল মানানসই, এবং যদি ফাইলটিতে ব্যাকস্ল্যাশ থাকে তবে আমি কীভাবে আমার সমাধানটি সংশোধন করতে পারি?
rubo77

3
আপনি ব্যবহার করতে হবে while read -r lineব্যাকস্ল্যাশ এবং সংরক্ষণ করা ... তারপর । বিশাল ফাইল / গতি হিসাবে, সত্যিই, আপনি সবচেয়ে খারাপ সমাধানটি বেছে নিয়েছেন। আমি মনে করি না এর বাইরে আরও খারাপ কিছু আছে। পাঠ্য খারাপ অনুশীলন প্রক্রিয়া করতে শেল লুপ ব্যবহার করছে কেন এর উত্তরগুলি দেখুন ? সর্বশেষ উত্তরের উপর আমার মন্তব্য সহ যেখানে আমি একটি স্পিড বেনমার্কের সাথে একটি লিঙ্ক যুক্ত করেছি। এখানে sedউত্তরগুলি পুরোপুরি সূক্ষ্ম IMO এবং এর চেয়ে অনেক ভাল read
don_crissti

@ ডন_ক্রিসিটি ... এবং / অথবা লাইনগুলির সাথে শুরু হয় -এবং তারপরে 1 বা আরও বেশি ই, ই বা এন অক্ষর এবং এবং / বা ন্যূনুয়াল অক্ষর সমন্বিত থাকে। এছাড়াও, সর্বশেষ নিউলাইনের পরে একটি অবসন্ন হওয়া লাইন এড়িয়ে যাবে।
স্টাফেন চেজেলাস

1
আপনি / ইত্যাদি / প্রোফাইলে (বা আপনার ~ / .bashrc বা ~ / .zshrc ইত্যাদি ...) উপন্যাসটি যুক্ত করতে পারেন ওরফে ট্রিম = "অজক" {\ $ 1 = \ $ 1}; 1 '"
জেফ ক্লেটন

22

যুক্তি ছাড়াই xargs এটি করে।

উদাহরণ:

trimmed_string=$(echo "no_trimmed_string" | xargs) 

1
এটি একটি লাইনের মধ্যে একাধিক স্পেস চুক্তি করে, যা প্রশ্নে অনুরোধ করা হয়নি
রোয়াইমা

1
@ রাইমা - সত্য তবে স্বীকৃত উত্তরটিও ফাঁকা স্থানগুলি (যা প্রশ্নে অনুরোধ করা হয়নি)। আমি মনে করি যে এখানে আসল সমস্যাটি হ'ল xargsযদি ইনপুটটিতে ব্যাকস্ল্যাশ এবং একক উদ্ধৃতি থাকে তবে সরবরাহ করতে ব্যর্থ হবে।
don_crissti

@ ডন_ক্রিসটি এর অর্থ এই নয় যে গৃহীত উত্তর সঠিকভাবে জিজ্ঞাসিত প্রশ্নের উত্তর দেয়। তবে এক্ষেত্রে এখানে এটি ক্যাভিয়েট হিসাবে চিহ্নিত করা হয়নি যদিও গৃহীত উত্তরে এটি ছিল। ভবিষ্যতের পাঠকের সাথে এটির প্রাসঙ্গিকতার ক্ষেত্রে আমি আশাবাদী সত্যটি হাইলাইট করেছি।
রোয়াইমা

এটি একক উদ্ধৃতি, ডাবল উদ্ধৃতি, ব্যাকস্ল্যাশ অক্ষরগুলিতেও বিরতি দেয়। এটি এক বা একাধিক echoঅনুরোধও চালায় । কিছু প্রতিধ্বনি বাস্তবায়ন বিকল্পগুলি এবং / অথবা ব্যাকস্ল্যাশগুলিও প্রক্রিয়া করবে ... এটি কেবলমাত্র একক-লাইন ইনপুট জন্য কাজ করে।
স্টাফেন চেজেলাস

17
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

আপনি যদি একটি শেল ভেরিয়েবলের মধ্যে একটি লাইন পড়ছেন, অন্যথায় নির্দেশ না দিলেread এটি ইতিমধ্যে কাজ করে ।


1
জন্য +1 read। সুতরাং আপনি যদি এটি পড়ার সময় পাইপ করেন তবে এটি কার্যকর হয়:cat file | while read i; do echo $i; done
রুব 77

1
@ রূবো আপনার উদাহরণ ব্যতীত অব্যক্ত পরিবর্তনশীলটিও শেল দ্বারা পুনরায় প্রসেস করা যায়। echo "$i"এর সত্যিকারের প্রভাবটি দেখতে ব্যবহার করুনread
রোয়াইমা

13

আপনি যদি ভেরিয়েবল হিসাবে লাইনগুলি সঞ্চয় করেন তবে আপনি কাজটি করতে ব্যাশ ব্যবহার করতে পারেন:

একটি স্ট্রিং থেকে নেতৃস্থানীয় হোয়াইটস্পেস সরান:

shopt -s extglob
echo ${text##+([[:space:]])}

একটি স্ট্রিং থেকে ট্রেলিং হোয়াইটস্পেস সরান:

shopt -s extglob
echo ${text%%+([[:space:]])}

একটি স্ট্রিং থেকে সমস্ত সাদা স্থান সরিয়ে ফেলুন:

echo ${text//[[:space:]]}

একটি স্ট্রিং থেকে সমস্ত সাদা-স্থান অপসারণ নেতৃস্থানীয় এবং অনুসরণযোগ্য স্থান উভয়ই সরিয়ে ফেলার মতো নয় (প্রশ্ন হিসাবে)।
catpnosis

সর্বোত্তম সমাধান - এটির জন্য কেবল ব্যাশ বিল্টিন প্রয়োজন এবং কোনও বাহ্যিক প্রক্রিয়া কাঁটাচামচ করা উচিত।
পিটারহ

2
খুশী হলাম। স্ক্রিপ্টগুলি খুব বেশি দ্রুত চালিত হয় যদি তাদের বাইরের প্রোগ্রামগুলিতে টানতে না হয় (যেমন কর্ক বা সেড)। এটি ksh এর "আধুনিক" (93u +) সংস্করণগুলির সাথেও কাজ করে।
ব্যবহারকারী1683793

9

একটি 'পাইপড' সরঞ্জামের জন্য প্রদত্ত রেখা থেকে সমস্ত নেতৃস্থানীয় এবং অনুসরণযোগ্য স্থানগুলি সরাতে, আমি 3 টি বিভিন্ন উপায় সনাক্ত করতে পারি যা সম্পূর্ণ সমতুল্য নয়। এই পার্থক্যগুলি ইনপুট লাইনের শব্দের মধ্যে ফাঁকা স্থান নিয়ে উদ্বেগ প্রকাশ করে। প্রত্যাশিত আচরণের উপর নির্ভর করে আপনি আপনার পছন্দটি করবেন।

উদাহরণ

পার্থক্যগুলি ব্যাখ্যা করতে, আসুন এই ডামি ইনপুট লাইনটি বিবেচনা করুন:

"   \t  A   \tB\tC   \t  "

TR

$ echo -e "   \t  A   \tB\tC   \t  " | tr -d "[:blank:]"
ABC

trসত্যিই একটি সহজ কমান্ড। এই ক্ষেত্রে এটি কোনও স্থান বা সারণী অক্ষর মুছে দেয়।

awk

$ echo -e "   \t  A   \tB\tC   \t  " | awk '{$1=$1};1'
A B C

awk শব্দের মধ্যবর্তী প্রতিটি ফাঁকা জায়গাগুলিতে লিডিং এবং টেলিং স্পেসগুলি মুছে ফেলে এবং একক জায়গায় স্থান চেপে যায়।

কিন্তু

$ echo -e "   \t  A   \tB\tC   \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
A       B   C

এই ক্ষেত্রে, sedশব্দের মধ্যে কোনও ফাঁক স্পর্শ না করে শীর্ষস্থানীয় এবং লেজুর স্থানগুলি মুছে দেয়।

মন্তব্য:

প্রতি লাইনে একটি শব্দের ক্ষেত্রে, trকাজটি করে।



তাদের (কখনও কখনও অপ্রত্যাশিত) আউটপুট সহ সমাধানের তালিকার জন্য +1।
টনি

@ user61382 এটি বরং দেরী, তবে মূল পোস্টে আমার মন্তব্য দেখুন।
টনি

@highmaintenance: ব্যবহার [:space:]পরিবর্তে [: ফাঁকা:] কমান্ড সংক্রান্ত trমত: ... | tr -d [:space:], নতুন লাইন খুব মুছে ফেলার জন্য। (দেখুন man tr:)
ট্রোন 5

6

সেড এর জন্য একটি দুর্দান্ত সরঞ্জাম:

                        # substitute ("s/")
sed 's/^[[:blank:]]*//; # parts of lines that start ("^")  with a space/tab 
     s/[[:blank:]]*$//' # or end ("$") with a space/tab
                        # with nothing (/)

আপনি এটি আপনার ক্ষেত্রে হয় পাঠ্যের পাইপিং উদাহরণস্বরূপ ব্যবহার করতে পারেন

<file sed -e 's/^[[...

বা যদি আপনার sedজিএনইউ হয় তবে এটি 'ইনলাইন' এ অভিনয় করে :

sed -i 's/...' file

তবে উত্সটি এইভাবে পরিবর্তন করা "বিপজ্জনক" কারণ এটি সঠিকভাবে কাজ না করে (বা এমনকি এটি করার পরেও!) এটি অপরিবর্তনযোগ্য হতে পারে, তাই প্রথমে ব্যাকআপ নিন (বা -i.bakকিছু বিএসডি sedএর পোর্টেবল হওয়ার সুবিধাও রয়েছে ) !


2

অনুবাদ কমান্ড কাজ করবে

cat file | tr -d [:blank:]

4
এই কমান্ডটি সঠিক নয় কারণ এটি ফাইল থেকে সমস্ত স্পেসগুলি সরিয়ে দেয় , কেবল শীর্ষস্থানীয় / পূর্ববর্তী হোয়াইটস্পেস নয়।
ব্রায়ান রেডবার্ড

@ ব্রায়ান রেডবার্ড আপনি সঠিক আছেন এটি শূন্যস্থান ছাড়াই একতরফা স্ট্রিংয়ের জন্য এখনও একটি দরকারী উত্তর।
অ্যান্টনি রটলেজ

0

যদি স্ট্রিংটি ট্রিম করার চেষ্টা করছে তা সংক্ষিপ্ত এবং অবিচ্ছিন্ন / সামঞ্জস্যপূর্ণ হয় তবে যে কোনও বাশ ফাংশনে এটি প্যারামিটার হিসাবে সহজেই পাস করতে পারে:

    trim(){
        echo $@
    }

    a="     some random string   "

    echo ">>`trim $a`<<"
Output
>>some random string<<
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.