फ़ाइल की शुरुआत में टेक्स्ट कैसे डालें?


213

अब तक मैं एक फ़ाइल की शुरुआत में एक पंक्ति जोड़ने का तरीका खोजने में सक्षम रहा हूं, लेकिन यह बिल्कुल वैसा नहीं है जैसा मैं चाहता हूं। मैं इसे एक उदाहरण पर दिखाता हूँ

फ़ाइल सामग्री

some text at the beginning

परिणाम

<added text> some text at the beginning

यह समान है लेकिन मैं इसके साथ कोई नई लाइन नहीं बनाना चाहता ...

मैं sedअगर संभव हो तो इसके साथ करना चाहूंगा ।


यहाँ कुछ भी आप के लिए काम? stackoverflow.com/questions/54365/… - आपको उपयोग करने की आवश्यकता नहीं है sed
wkl

जवाबों:


314

sed एक पते पर काम कर सकते हैं:

$ sed -i '1s/^/<added text> /' file

यह जादुई क्या है जो 1sआप यहाँ हर उत्तर पर देखते हैं। रेखा को संबोधित!

<added text>पहले 10 लाइनों पर जोड़ना चाहते हैं?

$ sed -i '1,10s/^/<added text> /' file

या आप उपयोग कर सकते हैं Command Grouping:

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}

67
वास्तव में एक नई लाइन डालने के लिए: sed -i '1s / ^ / <गयी टेक्स्ट> \ n /' फ़ाइल
jslatts

1
क्यों -i का उपयोग कर रहा हूँ ?? आदमी पर यह कहता है कि यह प्रत्यय के लिए है। linux.die.net/man/1/rew
endrigoantonini

-मैं जगह के लिए खड़ा है, आप एक प्रत्यय -i जोड़ सकते हैं ओवरराइट करने के बजाय एक प्रतिलिपि बनाने के लिए। -i.new नई फ़ाइल को .new के साथ समाप्त कर देगा, लेकिन बस -i सीधे फ़ाइल को संपादित करेगा।
जय कामत

3
ध्यान दें कि sed एक खाली फाइल पर काम नहीं करेगा - 0-लंबाई इनपुट के साथ afaict sed को कुछ भी करने के लिए नहीं बनाया जा सकता है।
जतिल

2
इस समाधान का दोष यह है कि यदि फ़ाइल खाली है तो यह पाठ को नहीं जोड़ता है।
DBedrenko

41

यदि आप किसी फ़ाइल की शुरुआत में एक पंक्ति जोड़ना चाहते हैं, तो आपको \nऊपर दिए गए सबसे अच्छे समाधान में स्ट्रिंग के अंत में जोड़ना होगा ।

सबसे अच्छा समाधान स्ट्रिंग को जोड़ देगा, लेकिन स्ट्रिंग के साथ, यह एक फ़ाइल के अंत में एक पंक्ति नहीं जोड़ेगा।

sed -i '1s/^/your text\n/' file

27

यदि फ़ाइल केवल एक पंक्ति है, तो आप उपयोग कर सकते हैं:

sed 's/^/insert this /' oldfile > newfile

यदि यह एक से अधिक लाइन है। में से एक:

sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile

मैंने बाद को शामिल किया है ताकि आप जान सकें कि लाइनों की सीमा कैसे करें। आप जिस पाठ को सम्मिलित करना चाहते हैं, उसकी प्रभावित रेखाओं पर ये दोनों "आरंभ" लाइन मार्कर को बदल देते हैं। आप यह भी मान सकते हैं (आपका sedआधुनिक पर्याप्त है) का उपयोग करें:

sed -i 'whatever command you choose' filename

इन-प्लेस एडिटिंग करना


11

आप उपयोग कर सकते हैं cat -

printf '%s' "some text at the beginning" | cat - filename

6
यह केवल फ़ाइल की सामग्री के बाद पाठ को आउटपुट करेगा, लेकिन यह फ़ाइल को बिल्कुल भी संशोधित नहीं करता है।
Adaephon

यह एक अच्छा समाधान है, मुझे आश्चर्य है कि यह किसी भी upvotes क्यों नहीं मिला। यहाँ मेरा अच्छा सर है। इसके अलावा, क्यों मुद्रण और एक साधारण गूंज नहीं?
येचू

1
@ लाइकॉउच - संभवतः क्योंकि कोई नया तरीका echoजोड़ने से रोकने का कोई पोर्टेबल तरीका नहीं है ?
टोबे स्पाइट

मैंने > fileइसे कमांड में जोड़कर एक फाइल में निर्देशित करने की कोशिश की , इसने मेरे टर्मिनल को स्पैम किया"some text at the beginning"
Theonlygusti

2
printf '%s' "some text" | cat - filename > tmpfile && mv tmpfile filename
लूका

10

केवल एक नई पंक्ति सम्मिलित करने के लिए:

sed '1i\\'


5

ध्यान दें कि OS X पर sed -i <pattern> file, विफल रहता है। हालाँकि, यदि आप एक बैकअप एक्सटेंशन प्रदान करते हैं sed -i old <pattern> file, तो निर्मित होते fileसमय file.oldइसे संशोधित किया जाता है। फिर आप file.oldअपनी स्क्रिप्ट में हटा सकते हैं ।


4
या sed -i '' फ़ाइल। तो यह सिर्फ जगह में संपादित करेंगे और बैकअप नहीं बनायेंगे।
हार्व जूल

मैंने पाया है कि macOS sed बैकअप बनाने के बिना डॉट को संपादित करना चाहता है: sed -i। <पैटर्न> फ़ाइल
ब्रायन

4

समस्या: मूल निर्देशिका के आधार नाम के साथ, फ़ाइल के शीर्ष पर एक फ़ाइल टैग करें।

यानी, के लिए

/mnt/Vancouver/Programming/file1

के शीर्ष के file1साथ टैग करें Programming

समाधान 1 - गैर-रिक्त फ़ाइलें:

bn=${PWD##*/}    ## bn: basename

sed -i '1s/^/'"$bn"'\n/' <file>

1s पाठ को फ़ाइल के पंक्ति 1 पर रखता है।

समाधान 2 - खाली या गैर-रिक्त फ़ाइलें:

sedआदेश, ऊपर, खाली फाइलों पर विफल रहता है। यहाँ एक समाधान है, जो /superuser/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841##6841 पर आधारित है।

printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>

ध्यान दें कि -बिल्ली कमांड में आवश्यक है (मानक इनपुट पढ़ता है: man catअधिक जानकारी के लिए देखें)। यहाँ, मेरा मानना ​​है कि, प्रिंटफ स्टेटमेंट (एसटीडीआईएन) के आउटपुट को लेना आवश्यक है, और कैट कि और फ़ाइल को अस्थायी करने के लिए ... http://www.linfo.org/cat के नीचे भी स्पष्टीकरण देखें .html

जब मैंने फाइलों को अधिलेखित करने के लिए पुष्टिकरण के लिए कहा, -fतो मैंने भी mvकमांड को जोड़ा ।

एक निर्देशिका पर पुनर्खरीद करने के लिए:

for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done

ध्यान दें कि यह रिक्त स्थान के साथ पथों पर टूट जाएगा; वहाँ समाधान हैं, कहीं और (जैसे फ़ाइल ग्लोबिंग, या find . -type f ...टाइप समाधान) उन लोगों के लिए।

पता : मेरी आखिरी टिप्पणी, यह स्क्रिप्ट आपको रास्तों में रिक्त स्थान के साथ निर्देशिकाओं की पुनरावृत्ति करने की अनुमति देगा:

#!/bin/bash

## /programming/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi

## To allow spaces in filenames,
##   at the top of the script include: IFS=$'\n'; set -f
##   at the end of the script include: unset IFS; set +f

IFS=$'\n'; set -f

# ----------------------------------------------------------------------------
# SET PATHS:

IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"

# /superuser/716001/how-can-i-get-files-with-numeric-names-using-ls-command

# FILES=$(find $IN -type f -regex ".*/[0-9]*")        ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*")         ## recursive; numeric filenames only (may include spaces)

# echo '$FILES:'                                      ## single-quoted, (literally) prints: $FILES:
# echo "$FILES"                                       ## double-quoted, prints path/, filename (one per line)

# ----------------------------------------------------------------------------
# MAIN LOOP:

for f in $FILES
do

  # Tag top of file with basename of current dir:
  printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f

  # Tag bottom of file with basename of current dir:
  printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done

unset IFS; set +f

3

गाड़ी वापसी के साथ हाय:

sed -i '1s/^/your text\n/' file

3

फ़ाइल के शीर्ष पर एक पंक्ति जोड़ने के लिए:

sed -i '1iText to add\'

इसमें एक नई पंक्ति शामिल है, जो प्रश्नकर्ता स्पष्ट रूप से नहीं चाहता है।
टोबे स्पाइट

मुझे वही देने के लिए धन्यवाद,
जिसकी

3

एक बहुत ही आसान तरीका है:

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt

ओउ ... सॉरी, अब जब मुझे एहसास हुआ कि आप शुरुआत में जोड़ना चाहते थे न कि नई लाइन।
राफेल विला बोस

लेकिन मुझे एक नई लाइन चाहिए थी। तो सरलीकृत दृष्टिकोण के लिए धन्यवाद।
TheSatinKnight

3

बस मज़े के लिए, यहाँ एक समाधान है edजिसके उपयोग से खाली फ़ाइल पर काम नहीं करने की समस्या नहीं है। आप इसे इस प्रश्न के किसी अन्य उत्तर की तरह ही शेल स्क्रिप्ट में डाल सकते हैं।

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

उपरोक्त स्क्रिप्ट पहली पंक्ति में सम्मिलित करने के लिए पाठ जोड़ता है, और फिर पहली और दूसरी पंक्ति में मिलती है। अमान्य ज्वाइन के साथ त्रुटि से बाहर निकलने से बचने के लिए, यह पहले फ़ाइल के अंत में एक खाली लाइन बनाता है और बाद में इसे मौजूद होने पर हटा देता है।

सीमाएँ: यह स्क्रिप्ट काम नहीं करता है अगर <added text>एक एकल अवधि के बराबर है।


2

मेरे दो सेंट:

sed  -i '1i /path/of/file.sh' filename

यह काम करेगा यहां तक ​​कि आगे स्लैश युक्त स्ट्रिंग भी है "/"


1
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

पहली बार tacफ़ाइल को पीछे की ओर पाइप करता है (अंतिम पंक्ति पहले) इसलिए "सम्मिलित करने के लिए पाठ" अंतिम दिखाई देता है। दूसरा tacइसे एक बार फिर से लपेटता है इसलिए सम्मिलित लाइन शुरुआत में है और मूल फ़ाइल अपने मूल क्रम में है।


1
क्या आप बता सकते हैं कि इस मुद्दे से टॉमस को कैसे मदद मिलेगी?
जॉन ओडम

टैक | tac - यह कि गैर-मापनीय मानसिकता कैसे
बनती है

0

उपनाम के साथ एक और समाधान। अपनी init rc / env फ़ाइल में जोड़ें:

addtail () { find . -type f ! -path "./.git/*" -exec sh -c "echo $@ >> {}" \; }
addhead () { find . -type f ! -path "./.git/*" -exec sh -c  "sed -i '1s/^/$@\n/' {}" \; }

उपयोग:

addtail "string to add at the beginning of file"
addtail "string to add at the end of file"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.