Xargs इनपुट से स्ट्रिप कोट्स क्यों करता है?


25

Xargs इनपुट टेक्स्ट से स्ट्रिप कोट्स क्यों करता है?

यहाँ एक सरल उदाहरण दिया गया है:

echo "/Place/='http://www.google.com'" | xargs echo

आउटपुट

/Place/=http://www.google.com

क्या इसके आसपास काम करने का कोई तरीका है? (xargs -0 मेरी मदद नहीं करता है)


1
xargsविशेष रूप से कल्पना के भाग के रूप में उद्धरण और बैकस्लैश का व्यवहार करता है । xargsइसके बजाय आप क्या करने की कोशिश कर रहे हैं पोस्ट करें ।
jw013

3
xargs -0मेरे लिए यहाँ काम करता है ... यह आपकी मदद क्यों नहीं करता है?
derobert

जवाबों:


10

से xargsमैनुअल:

यदि आप रिक्त या क्षैतिज टैब समाहित करने के लिए एक इनपुट तर्क चाहते हैं, तो इसे दोहरे उद्धरण या एपोस्ट्रोफ़ में संलग्न करें। यदि तर्क में दोहरा उद्धरण वर्ण ( ") है, तो आपको एपोस्ट्रोफ़ में तर्क को संलग्न करना होगा। इसके विपरीत, यदि तर्क में एपोस्ट्रोफ ( ') शामिल है, तो आपको तर्क को दोहरे उद्धरण चिह्नों में शामिल करना होगा। आप \वर्ण को किसी विशेष अर्थ को अनदेखा करने के लिए वर्ण के सामने एक बैकस्लैश ( ) भी रख सकते हैं जिसका अर्थ हो सकता है कि चरित्र में हो सकता है (उदाहरण के लिए, सफेद स्थान वर्ण, या उद्धरण)।

इसका मतलब है कि यदि आप उद्धरण स्वयं उद्धृत किए जाते हैं तो आप उद्धरणों से बच सकते हैं:

$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'

काम करेंगे, लेकिन echo /Place/=\'http://www.google.com\' | xargs echoनहीं करेंगे


1
वोटों के खिलाफ कुछ भी नहीं है, लेकिन कारण पर एक टिप्पणी से मदद मिलेगी :-)
Matteo

3
यदि आप इनपुट में पाइपिंग कर रहे हैं तो क्या होगा? यदि मेरे पास एक स्क्रिप्ट है जो आउटपुट देती है "/Place/='http://www.google.com'", तो मैं इसे कैसे ठीक से बच सकता हूं?
रोजर फिल्ममेकर

1
@RogerFilmyer your_script | समानांतर - शंखनाद | ...
ओले तांगे

19

यदि आप उद्धरणोंxargs को नजरअंदाज करना चाहते हैं, तो एक अच्छी आत्मा xargsध्वज झंडे -0 का उपयोग हो सकता है

सीधे मैन पेज विकल्प से

विकल्प -0, -

इनपुट आइटम को व्हाट्सएप के बजाय एक अशक्त चरित्र द्वारा समाप्त किया जाता है, और उद्धरण और बैकलैश विशेष नहीं हैं (प्रत्येक वर्ण को शाब्दिक रूप से लिया गया है)। फ़ाइल स्ट्रिंग के अंत को अक्षम करता है, जिसे किसी अन्य तर्क की तरह माना जाता है। उपयोगी जब इनपुट आइटम में सफेद स्थान, उद्धरण चिह्न या बैकस्लैश हो सकते हैं। GNU फाइंड -प्रिंट0 विकल्प इस मोड के लिए उपयुक्त इनपुट का उत्पादन करता है।

मैंने एक GNU सिस्टम पर जाँच की है जो -dविकल्प (और सिर्फ नहीं ) के साथ एक विशिष्ट मूल्य (जैसे एक नईलाइन) के लिए सीमांकक की स्थापना करता है, विशेष रूप से उद्धरण आदि का इलाज न करने का -0कारण भी होगा xargs:

-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$ 


7

मुझे मैनपेज में एक और समाधान मिला: स्पष्ट रूप से सीमांकक को '\ n' होने के लिए निर्दिष्ट करें। यह उद्धरण के लिए विशेष हैंडलिंग को बंद कर देता है:

- डेलिमिटर = डेलिम, -डी डेलिम

इनपुट आइटम निर्दिष्ट चरित्र द्वारा समाप्त किए जाते हैं। निर्दिष्ट सीमांकक एक एकल वर्ण हो सकता है, एक C- शैली वर्ण एस्केप जैसे कि \ n, या एक ऑक्टल या हेक्साडेसिमल एस्केप कोड। ऑक्टल और हेक्साडेसिमल एस्केप कोड को प्रिंटफ कमांड के लिए समझा जाता है। मल्टीबाइट वर्ण समर्थित नहीं हैं। इनपुट को संसाधित करते समय, उद्धरण और बैकलैश विशेष नहीं होते हैं; इनपुट में प्रत्येक वर्ण शाब्दिक रूप से लिया गया है।

इसलिए,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

आउटपुट

/Place/='http://www.google.com'

ध्यान दें कि यह GNU xargsया संगत
स्टीफन Chazelas

यह भी ध्यान दें कि यह अंतरिक्ष और टैब को सीमांकक के रूप में पहचाने जाने से रोकता है (शायद ओपी के मामले में भी)।
स्टीफन चेज़लस

बालमन ने एक समान समाधान दिया (अच्छी तरह से @imz ) हालांकि आपका कुछ इस रूप में बेहतर है कि वह ksh93 $'...'उद्धृत ऑपरेटर के उपयोग से बचता है जो हर शेल कार्यान्वयन में नहीं पाया जाता है।
स्टीफन चेज़लस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.