किसी फ़ाइल की पहली पंक्ति हटाएं


110

मैं किसी फ़ाइल की पहली पंक्ति को कैसे हटा सकता हूं और परिवर्तन रख सकता हूं?

मैंने यह कोशिश की, लेकिन यह फ़ाइल की पूरी सामग्री को मिटा देता है।

$sed 1d file.txt > file.txt

जवाबों:


81

उस आदेश के बाद file.txt खाली है, वह आदेश है जिसमें शेल चीजें करता है। पहली बात जो उस रेखा के साथ होती है वह पुनर्निर्देशन है। फ़ाइल "file.txt" खोला और 0 बाइट्स के लिए छोटा है। उसके बाद sed कमांड चलता है, लेकिन बिंदु पर फ़ाइल पहले से ही खाली है।

कुछ विकल्प हैं, अधिकांश में एक अस्थायी फ़ाइल में लिखना शामिल है।

sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file

perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file

2
बीएसडी के साथ sed, आप उपयोग कर सकते हैं sed -i .bak '1d' file.txt

1
वहाँ एक तरीका है कि अस्थायी फ़ाइल शामिल नहीं है? वैसे भी, यह चाल चलेगा। आपका बहुत बहुत धन्यवाद!
Kickass13

@ Kickass13 संभवतः एक पाठ संपादक जैसे का उपयोग कर ed
जोर्डनम

6
edकमांड यह होगी: printf "%s\n" 1d w q | ed file.txt(मैं दिल ईडी)
ग्लेन जैकमैन

1
@ जोंय्रेयस-exec sed -i '1d' {} \;
जोर्डनम

141

एक बहुत ही हल्का विकल्प केवल सब कुछ 'पूंछ' करना है लेकिन पहली पंक्ति (यह फ़ाइल हेडर को हटाने का एक आसान तरीका हो सकता है):

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout

@ इवान टिटेलमैन के बाद, आप कर सकते हैं:

tail -n +2 file.txt | sponge file.txt

अस्थायी फ़ाइल से बचने के लिए। एक और विकल्प हो सकता है:

echo "$(tail -n +2 file.txt)" > file.txt

इत्यादि। पिछले एक परीक्षण:

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$ 

ओह, हमने एक नई पंक्ति खो दी (प्रति @ 1_CR टिप्पणी नीचे), इसके बजाय प्रयास करें:

printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5  

[user@work ~]$ 

वापस आकर sed, कोशिश करें:

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt

या शायद

echo -e "$(sed '1d' file.txt)\n" > file.txt

दुष्प्रभाव से बचने के लिए।


मैंने अभी इसे अपने फेडोरा सिस्टम पर आज़माया है और आउटपुट ऊपर है। आप सही हैं - यह इंगित करने के लिए धन्यवाद।
असिमलैब्स

tailचाल मेरे लिए काम किया (एक 130mb फ़ाइल पर कम से कम 3 सेकंड लिया)। धन्यवाद!
elo80ka

echo "$(tail -n +2 file.txt)" > file.txtएकदम सही जवाब है।
एलेक्स राज कालीमूर्ति

धन्यवाद! echo "$ (tail -n +2 file.txt)"> file.txt मेरे लिए एक आकर्षण की तरह काम करता है!
Arsenii

16

इसके अलावा पर एक नज़र spongeसे moreutilsspongeमानक इनपुट से डेटा में soaks जब तक मानक इनपुट का लेखन फ़ाइल में लिखने से पहले बंद हो जाता है। यह इस तरह प्रयोग किया जाता है:

sed '1d' file.txt | sponge file.txt

14

यह विषय रुचि है, इसलिए मैं 3 तरीकों से बेंचमार्क का परीक्षण करता हूं:

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. sed -i '1d' d.txt

ध्यान दें कि लक्ष्य d.txt5.4GB फ़ाइल है

परिणाम प्राप्त करें:


run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s

निष्कर्ष: यह सबसे तेज तरीका है:

sed '1d' file.txt > tmpfile; mv tmpfile file.txt


आपकी sed '1d' d.txtविधि में शामिल नहीं है (या इसलिए यह आपके परीक्षणों को पढ़कर लगता है) mvकमांड। 20MB फ़ाइल के साथ FreeBSD पर मेरे परीक्षणों sed -iमें सबसे तेज था।
सूपालाजो डी एरियेरेज़

9

exसही स्थान पर संपादन के लिए इस्तेमाल किया जा सकता है जिसमें एक अस्थायी फ़ाइल शामिल नहीं है

ex -c ':1d' -c ':wq' file.txt

2
पूर्व एक अस्थायी फ़ाइल का उपयोग करता है। strace -e open ex -c ':1d' -c ':wq' foo। पूर्व मूल फ़ाइल को अस्थायी फ़ाइल के साथ जोड़ देता है, जहाँ GNU sed का -i विकल्प टेम्पर्ड फ़ाइल के साथ मूल को अधिलेखित कर देता है। मुझे यकीन नहीं है कि बीएसडी का सेड कैसे काम करता है।
16

@ अलुआ, आप सही कह रहे हैं। मैंने उस पर भी ध्यान दिया, लेकिन बाद में
iruvar

3

फ़ाइल का उपयोग करके पहली पंक्ति को हटाने का सबसे छोटा और सरल तरीका sedहै:

$ sed -i -n -e '2,$p' file.txt

3

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -s -c '1d|x' file.txt
  1. 1 पहली पंक्ति खोजें

  2. d हटाना

  3. x सहेजें और बंद करें


0

यह कमांड 1 लाइन को हटा देगा और "file.txt" के रूप में सेव करेगा।

sed '1d' file.txt  > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt

0

फ़ाइल में एक प्रीटायलर लाइन को हटाने के लिए

  1. पहली पंक्ति को हटाएं

सिड '1 डी' फ़ाइल

  1. पहली और तीसरी लाइन हटाएं

सिड '1d3d' फ़ाइल

लाइन में करेक्टर को हटाएं

1 लिन में पहले दो चार्टर हटाएं

एसईडी / / ^..// फ़ाइल

2 अंतिम दो चिरकटेरिन लाइन हटाएं

एसईडी / .. £ // 'फ़ाइल

3 रिक्त लाइन हटाएं

सिड '/ ^ £ / d' फ़ाइल


4
क्या अंग्रेजों ने उपनिवेशों को फिर से बनाया? पिछली बार मैंने देखा था, £$
जी-मैन

पाउंड ने संकेत दिया गुड़िया का चिह्न ..
विवेक पारिख


-2

बिल्ली file01 | sed -e '1,3d'

// file01 में सामग्री दिखाएं लेकिन पहली और तीसरी पंक्ति को हटा दें


2
आपके द्वारा दी जाने वाली sed कमांड 1, 2 और 3.
icarus

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