2011-12-06 12 views
5

को प्रतिस्थापित करता है, मैं TAB एस stdout में सेमिकोलन के साथ प्रतिस्थापित करना चाहता हूं, ZSH खोल से sed चलाकर।sed शाब्दिक टैब

मैं समझता हूँ कि एक सामान्य रूप से कर सकते हैं (अन्य गोले में?) का उपयोग करें:

somecommand | sed 's/\t/;/g' 

हालांकि, इस FreeBSD के तहत ZSH-खोल में मेरे लिए काम नहीं करता। \t tabulators मेल नहीं खाता। ऐसा क्यों है? मैं भी (5 तक) एकाधिक बैकस्लैश कोशिश की है।


यह करता है काम:

somecommand | sed 's/[TAB]/;/g' 

, जहां [TAB] एक वास्तविक TAB -वर्ण, Ctrl-V अपने कीबोर्ड पर TAB बटन दर्ज करके डाला है।

zsh की

उत्तर

9

उपयोग इसके साथ कोई संबंध नहीं है। \t नियमित एसईडी में प्रयोग किया जाता भाव करने के लिए एक जीएनयू विस्तार है। बीएसडी sed पर, आपके पास एक्सटेंशन नहीं हैं, इसलिए शाब्दिक टैब का उपयोग करना होगा।

+0

धन्यवाद, कि वास्तव में चीजों को मंजूरी दे दी है मेरे लिए! – poplitea

+9

@poplitea यदि आपकी स्क्रिप्ट केवल ksh93, bash या zsh (pdksh, बोर्न या राख जैसे अन्य sh भिन्नताओं के विपरीत) में चलती है, तो आप '$ 's/\ t /; /' g' का उपयोग कर सकते हैं जहां खोल बैकस्लैश विस्तार करता है और 'sed' एक शाब्दिक टैब चरित्र देखता है। – Gilles

+0

@Gilles: बहुत खूब! मुझे $() का पता था, लेकिन $ 'प्रतिस्थापन नहीं। बहुत बहुत धन्यवाद, इससे मेरी समस्या को हल करना आसान हो जाता है। आपको शायद टिप्पणी के बजाए इसे उत्तर में रखना चाहिए, हालांकि (?)। – poplitea

3

एक विकल्प प्रिंटफ के साथ समय से पहले अपनी sed स्क्रिप्ट तैयार करना है।

scr="`printf 's/\t/;/g'`" 
somecommand | sed "$scr" 

लेकिन माइकल ++ ... वहाँ अन्य एसईडी वेरिएंट भी printf शैली पलायन का समर्थन करने वाले हो सकते हैं, लेकिन यह निश्चित रूप "मानक" नहीं है।

0

क्या आप जानते आदेश के उत्पादन में सामान्य पाठ (केवल वे टैब & प्रिंट करने योग्य पाठ) है, तो आप इस्तेमाल कर सकते हैं:

somecommand | sed -E 's/[[:cntrl:]]/;/g' 

-E "विस्तारित" नियमित अभिव्यक्ति है, जो चरित्र वर्ग के नाम हो सकते हैं पर बदल जाता है।