जवाबों:
आप नहीं कर सकते। या तो एड या जीएनयू सेड या पर्ल का उपयोग करें, या वे पर्दे के पीछे क्या करते हैं, जो सामग्री के लिए एक नई फ़ाइल बनाना है।
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