जवाबों:
उस आदेश के बाद 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
ed
।
ed
कमांड यह होगी: printf "%s\n" 1d w q | ed file.txt
(मैं दिल ईडी)
-exec sed -i '1d' {} \;
एक बहुत ही हल्का विकल्प केवल सब कुछ 'पूंछ' करना है लेकिन पहली पंक्ति (यह फ़ाइल हेडर को हटाने का एक आसान तरीका हो सकता है):
# -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 सेकंड लिया)। धन्यवाद!
echo "$(tail -n +2 file.txt)" > file.txt
एकदम सही जवाब है।
इसके अलावा पर एक नज़र sponge
से
moreutils
। sponge
मानक इनपुट से डेटा में soaks जब तक मानक इनपुट का लेखन फ़ाइल में लिखने से पहले बंद हो जाता है। यह इस तरह प्रयोग किया जाता है:
sed '1d' file.txt | sponge file.txt
यह विषय रुचि है, इसलिए मैं 3 तरीकों से बेंचमार्क का परीक्षण करता हूं:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
sed -i '1d' d.txt
ध्यान दें कि लक्ष्य d.txt
5.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
में सबसे तेज था।
ex
सही स्थान पर संपादन के लिए इस्तेमाल किया जा सकता है जिसमें एक अस्थायी फ़ाइल शामिल नहीं है
ex -c ':1d' -c ':wq' file.txt
strace -e open ex -c ':1d' -c ':wq' foo
। पूर्व मूल फ़ाइल को अस्थायी फ़ाइल के साथ जोड़ देता है, जहाँ GNU sed का -i विकल्प टेम्पर्ड फ़ाइल के साथ मूल को अधिलेखित कर देता है। मुझे यकीन नहीं है कि बीएसडी का सेड कैसे काम करता है।
आप पूर्व मोड में विम का उपयोग कर सकते हैं:
ex -s -c '1d|x' file.txt
1
पहली पंक्ति खोजें
d
हटाना
x
सहेजें और बंद करें
यह कमांड 1 लाइन को हटा देगा और "file.txt" के रूप में सेव करेगा।
sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
फ़ाइल में एक प्रीटायलर लाइन को हटाने के लिए
सिड '1 डी' फ़ाइल
सिड '1d3d' फ़ाइल
लाइन में करेक्टर को हटाएं
1 लिन में पहले दो चार्टर हटाएं
एसईडी / / ^..// फ़ाइल
2 अंतिम दो चिरकटेरिन लाइन हटाएं
एसईडी / .. £ // 'फ़ाइल
3 रिक्त लाइन हटाएं
सिड '/ ^ £ / d' फ़ाइल
£
≠ $
।
ऐसा करने के लिए विम का उपयोग कर सकते हैं:
vim -u NONE +'1d' +wq! /tmp/test.txt
बिल्ली file01 | sed -e '1,3d'
// file01 में सामग्री दिखाएं लेकिन पहली और तीसरी पंक्ति को हटा दें
sed
, आप उपयोग कर सकते हैंsed -i .bak '1d' file.txt
।