2010-12-12 6 views
17

मैं मानक इनपुट से लाइनों को पढ़ने के लिए एक बैश तरीका चाहता हूं (इसलिए मैं इसे पाइप इनपुट कर सकता हूं), और केवल अग्रणी और पीछे वाले अंतरिक्ष वर्णों को हटा दें। गूंजने के लिए पिपिंग काम नहीं करता है।मैं बैश पर मानक इनपुट से पढ़ने वाली रेखाओं को कैसे ट्रिम करूं?

उदाहरण के लिए, यदि इनपुट है:

 12 s3c 
    sd wqr 

उत्पादन किया जाना चाहिए:

12 s3c 
sd wqr 

मैं एक अजगर स्क्रिप्ट या इस के रूप में के रूप में तुच्छ कुछ के लिए इसी तरह के लेखन से बचना चाहते हैं। किसी भी मदद की सराहना की है! केवल एक प्रतिस्थापन के साथ

trim() { while read -r line; do echo "$line"; done; } 

sed का उपयोग करना::

उत्तर

20

आप एसईडी उपयोग कर सकते हैं इसे ट्रिम करने के लिए।

sed 's/^ *//;s/ *$//' 

आप ऐसा करके एक कमांड लाइन पर वास्तव में इसे आसानी से परीक्षण कर सकते हैं:

echo -n " 12 s3c " | sed 's/^ *//;s/ *$//' && echo c 
+9

दो sed प्रक्रिया असुविधाजनक हेवीवेट है। क्यों नहीं: 'sed's/^ * //; s/* $ //' '? –

+0

वह जो डेटा प्रदान करता है उसके खिलाफ काम करता है। मैंने आपको इसके लिए अंक दिए! : डी – phillip

+3

क्यों 'sed -r'/* (। *) */\ 1/g'' क्यों नहीं? –

17
$ trim() { read -r line; echo "$line"; } 
$ echo " aa bb cc " | trim 
aa bb cc 
$ a=$(echo " aa bb cc " | trim) 
$ echo "..$a.." 
..aa bb cc.. 

यह बहु लाइन इनपुट के लिए काम करने के लिये एक while पाश जोड़ने

sed 's/^\s*\(.*[^ \t]\)\(\s\+\)*$/\1/' 
+1

मुझे सरल उपयोगिता दृष्टिकोण पसंद है। आपको समय के वाक्यविन्यास को ठीक करने की आवश्यकता है: 'trim() {read -r लाइन जबकि; echo "$ line" करें; किया हुआ; } ' – Barak1731475

+0

@ user1731475: निश्चित, धन्यवाद –

+1

ध्यान दें कि इस उत्तर का बिंदु 'केवल पढ़ने के आदेश का उपयोग करें, यह डिफ़ॉल्ट रूप से ट्रिम करेगा'। गूंज का उपयोग पूरी तरह से प्रश्न में 'उत्पादन होना चाहिए' परीक्षण स्थिति से मेल खाता है। यह देखने के लिए कि अनुरोधित व्यवहार कैसे प्राप्त नहीं किया जाए या समझें कि यह _possible_ क्यों काम नहीं कर सकता है, यह [देखें] [http://stackoverflow.com/questions/7314044/use-bash-to-read-line-by लाइन और रख-स्पेस)। – SensorSmith

1

मैं जानता हूँ कि यह पुराना है, लेकिन एक और सरल और गंदा है रास्ता:

line=$(echo $line) 

यह उदाहरण देखें:

[email protected]:~$ x=" abc " 
[email protected]:~$ echo "+$x+" 
+ abc + 
[email protected]:~$ y=$(echo $x) 
[email protected]:~$ echo "$y" 
+abc+ 
+0

का समर्थन करता है यह टूटा हुआ है: ग्लोब होने पर विफल हो जाएगा पात्र, और लगातार रिक्त स्थान को भी जोड़ देंगे। उल्लेख नहीं है कि 'echo' आमतौर पर एक खराब विकल्प होता है (यदि, उदाहरण के लिए, रेखा' -n', '-e' या' -E' के साथ शुरू होती है)। –

+0

मेरे लिए काम करता है। धन्यवाद। – Geddon

1
your_command | xargs -L1 echo 

यह काम करता है क्योंकि echo, एक भी जगह के लिए रिक्त स्थान के लिए सभी tabls और उसके बाद सभी एकाधिक रिक्त स्थान धर्मान्तरित केवल प्रमुख नहीं और अनुगामी, उदाहरण देखें:

$ printf " 1\t\t\t2 3" 
    1   2 3 
$ echo `printf " 1\t\t\t2 3"` 
1 2 3 

खामी यह है कि है \'" जैसे कुछ उपयोगी पात्रों को भी हटा देगा।

+2

बैकस्लैश या उद्धरण होने पर यह असफल हो जाएगा। –

संबंधित मुद्दे