जवाबों:
आप नहीं कर सकते। या तो एड या जीएनयू सेड या पर्ल का उपयोग करें, या वे पर्दे के पीछे क्या करते हैं, जो सामग्री के लिए एक नई फ़ाइल बनाना है।
ed, पोर्टेबल:
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF
जीएनयू sed :
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
पर्ल:
perl -i -l -F, -pae 'print @F[1,3]' foo
cutएक नई फ़ाइल बनाना (अनुशंसित, क्योंकि यदि आपकी स्क्रिप्ट बाधित है, तो आप इसे फिर से चला सकते हैं):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut, जगह में फ़ाइल की जगह और के स्वामित्व और अनुमति बरकरार रखती है foo , लेकिन रुकावट के खिलाफ सुरक्षा की जरूरत है):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
मैं cut-based तरीकों में से एक का उपयोग करने की सलाह देता हूं । इस तरह आप किसी भी गैर-मानक उपकरण पर निर्भर नहीं होते हैं, आप नौकरी के लिए सबसे अच्छे उपकरण का उपयोग कर सकते हैं, और आप व्यवधान पर व्यवहार को नियंत्रित कर सकते हैं।
cut -d , -f 1,3 foo > foo.new rm foo mv foo.new foo
rm foo। और आपको कॉल नहीं करना चाहिए rm foo, क्योंकि mv foo.new fooयह परमाणु है: यह पुराने संस्करण को हटा देता है और एक ही समय में नए संस्करण को रखता है।
Moreutils ubuntu (और यह भी से पैकेज डेबियन ) नामक एक कार्यक्रम है sponge, जो तरह-की भी अपनी समस्या का हल।
आदमी स्पंज से:
स्पंज मानक इनपुट पढ़ता है और इसे निर्दिष्ट फ़ाइल पर लिखता है। शेल पुनर्निर्देशित के विपरीत, स्पंज आउटपुट फ़ाइल खोलने से पहले अपने सभी इनपुट को भिगो देता है। यह उन पाइपलाइनों को संकुचित करने की अनुमति देता है जो उसी फ़ाइल से पढ़ते हैं और लिखते हैं।
जो आपको कुछ ऐसा करने देगा:
cut -d <delim> -f <fields> somefile | sponge somefile
मुझे नहीं लगता कि cutअकेले उपयोग करना संभव है । मैं इसे आदमी या जानकारी पृष्ठ में नहीं ढूँढ सका। आप ऐसा कुछ कर सकते हैं
mytemp=$(mktemp) && cut -d" " -f1 file > $mytemp && mv $mytemp file
mktempआपको एक अपेक्षाकृत सुरक्षित अस्थायी फ़ाइल बनाता है जिसे आप cutआउटपुट में पाइप कर सकते हैं ।
आप POSIX Awk के साथ घोल का उपयोग कर सकते हैं:
cut -b1 file | awk 'BEGIN{RS="";getline<"-";print>ARGV[1]}' file
ठीक है, क्योंकि cutयह कम उत्पादन से पढ़ता है, आप कर सकते हैं:
cut -c1 < file 1<> file
यही है, इसकी स्टडी को fileरीड-ओनली मोड में ओपन करें और इसकी स्टडआउट fileको ट्रंकेशन ( <>) के बिना रीड + राइट मोड में ओपन करें ।
इस तरह, cutकेवल फ़ाइल को अपने आप से अधिलेखित कर देगा। हालांकि, यह बाकी फाइल को अछूता छोड़ देगा। उदाहरण के लिए, यदि fileइसमें शामिल हैं:
foo
bar
आउटपुट बन जाएगा:
f
b
bar
f\nb\nजगह ले ली है foo\n, लेकिन barअभी भी वहाँ है। cutसमाप्त होने के बाद आपको फ़ाइल को छोटा करना होगा ।
इसके साथ ksh93, आप इसे अपने <>;ऑपरेटर के साथ कर सकते हैं जो इस तरह के कार्य करता है <>कि यदि कमांड सफल होता है, ftruncate()तो इसे फाइल डिस्क्रिप्टर पर बुलाया जाता है। इसलिए:
cut -c1 < file 1<>; file
अन्य गोले के साथ, आपको ftruncate()कुछ अन्य माध्यमों से करने की आवश्यकता होगी जैसे:
{ cut -c1 < file; perl -e 'truncate STDOUT, tell STDOUT';} 1<> file
हालाँकि perlइसके लिए बस थोड़ा सा ओवरकॉक करना विशेष रूप से यहाँ पर विचार perlकरना है जो आसानी से ऐसा कर सकता है cutजैसे:
perl -pi -e '$_ = substr($_, 0, 1)' file
खबरदार कि अगर इन सभी तरीकों से वास्तविक इन-री-री राइटिंग शामिल है, यदि ऑपरेशन बीच में बाधित होता है, तो आप एक दूषित फ़ाइल के साथ समाप्त हो जाएंगे। एक अस्थायी दूसरी फ़ाइल का उपयोग इस समस्या से बचा जाता है।
.oldइन-प्लेस परिवर्तनों के लिए विधि की तुलना में बेहतर ,echo "$(cut -d , -f 1,3 <foo)" > foo