Dosyanın başına nasıl metin eklenir?


213

Şimdiye kadar bir dosyanın başına nasıl satır ekleyebildiğimi bulabildim ama tam olarak istediğim bu değil. Bir örnek üzerinde göstereceğim

Dosya içeriği

some text at the beginning

Sonuç

<added text> some text at the beginning

Benzer ama onunla yeni bir çizgi oluşturmak istemiyorum ...

sedMümkünse bunu yapmak istiyorum.


Burada bir şey senin için çalışıyor mu? stackoverflow.com/questions/54365/… - kullanmanıza gerek yoktur sed.
wkl

Yanıtlar:


314

sed bir adres üzerinde çalışabilir:

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

1sBuradaki her cevapta gördüğünüz bu büyülü şey nedir ? Satır adresleme! .

<added text>İlk 10 satıra eklemek ister misiniz ?

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

Veya şunları kullanabilirsiniz Command Grouping:

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

67
Aslında yeni bir satır eklemek için: sed -i '1s / ^ / <eklenen metin> \ n /' dosya
jslatts

1
Neden -i ?? Adamda bunun sonek için olduğunu söylüyor. linux.die.net/man/1/sed
endrigoantonini

-i yerinde duruyor, üzerine yazmak yerine -i'ye bir sonek ekleyebilirsiniz. -i.new, .new ile biten yeni bir dosya oluşturur, ancak yalnızca -i dosyayı doğrudan düzenler.
Jay Kamat

3
Sed'in boş bir dosyada çalışmadığını unutmayın - afaict sed 0 uzunluklu girdi ile hiçbir şey yapmak için yapılamaz.
jthill

2
Bu çözümün kusuru, dosya boşsa metni eklememesidir.
DBedrenko

41

Dosyanın başına bir satır eklemek isterseniz \n, dizenin sonuna yukarıdaki en iyi çözümü eklemeniz gerekir .

En iyi çözüm dizeyi ekler, ancak dizeyle bir dosyanın sonuna satır eklemez.

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

27

Dosya yalnızca bir satırsa aşağıdakileri kullanabilirsiniz:

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

Birden fazla satır varsa. biri:

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

İkincisini dahil ettim, böylece çizgi aralıklarını nasıl yapacağınızı biliyorsunuz. Bunların her ikisi de, etkilenen satırlarındaki başlangıç ​​çizgisi işaretçisini eklemek istediğiniz metinle "değiştirir". Ayrıca ( sedyeterince modern olduğunu varsayarak ) şunları kullanabilirsiniz:

sed -i 'whatever command you choose' filename

yerinde düzenleme yapmak.


11

Kullanabilirsiniz cat -

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

6
Bu, yalnızca metnin ardından dosyanın içeriğini çıkarır, ancak dosyayı hiç değiştirmez.
Adaephon

Bu iyi bir çözüm, neden herhangi bir oylama almadığını merak ediyorum. İşte benim iyi efendim. Ayrıca, neden basit bir yankı değil printf?
ychaouche

1
@ychaouche - muhtemelen echobir satırsonu eklemeyi önlemenin taşınabilir bir yolu olmadığı için mi?
Toby Speight

> fileKomuta ekleyerek bunu bir dosyaya yönlendirmeyi denedim , benim terminal ile jus spam"some text at the beginning"
jeonlygusti

2
printf '%s' "some text" | cat - filename > tmpfile && mv tmpfile filename
luca

10

Yalnızca yeni satır eklemek için:

sed '1i\\'

8

Alt kabuk kullanın:

echo "$(echo -n 'hello'; cat filename)" > filename

5

OS X'te sed -i <pattern> filebaşarısız olduğunu unutmayın. Bir yedek uzantısını sağlamak Ancak, sed -i old <pattern> filedaha sonra fileise yerine değiştirilir file.oldoluşturulur. Daha sonra file.oldkomut dosyanızdan silebilirsiniz .


4
Veya sed -i '' dosyası. Sonra sadece yerinde düzenler ve yedeklemez.
Harv

MacOS sed bir nokta oluşturmadan yerinde düzenlemek için bir nokta istiyor: sed -i buldum. <desen> dosya
Bryan

4

SORUN: Bir dosyayı üst dizinin temel adıyla dosyanın üst kısmında etiketleyin.

Yani, için

/mnt/Vancouver/Programming/file1

üst etiketlemek file1ile Programming.

ÇÖZÜM 1 - boş olmayan dosyalar:

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

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

1s metni dosyanın 1. satırına yerleştirir.

ÇÖZÜM 2 - boş veya boş olmayan dosyalar:

Yukarıdaki sedkomut boş dosyalarda başarısız olur. İşte /superuser/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841 tabanlı bir çözüm

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

O Not -cat komutu gereklidir (standart girdi okur: bkz man catfazla bilgi için). Burada, printf ifadesinin (STDIN'a) çıktısını alması ve bu ve dosyanın geçici olarak ayarlanması gerektiğine inanıyorum ... Ayrıca http://www.linfo.org/cat adresindeki açıklamaya bakın. .html .

Ben de eklendi -fiçin mvdosyaların yenilenmesinde teyitleri isteniyor önlemek için, komuta.

Bir dizin üzerinden bilgi almak için:

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

Bunun boşluklu yolları da kıracağını unutmayın; bunlar için başka yerlerde çözümler vardır (örneğin dosya globlama veya find . -type f ...-tip çözümler).

ADDENDUM: Re: son yorumum, bu komut dosyası, yollarda boşlukları olan dizinleri tekrarlamanızı sağlayacak:

#!/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

Merhaba taşıma iadesi ile:

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

3

Dosyanın üstüne bir satır eklemek için:

sed -i '1iText to add\'

Bu, sorgulayıcının açıkça istemediği bir satırsonu içerir.
Toby Speight

Bana tam olarak ihtiyacım olanı verdiğiniz için teşekkürler
FindOutIslamNow

3

Çok kolay bir yol var:

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

Ow ... üzgünüm, şimdi yeni bir satır değil başlangıçta eklemek istediğinin farkındayım.
Raphael Villas Boas

Ama ben yeni bir satır istedi. Basit yaklaşım için teşekkürler.
TheSatinKnight

3

Sadece eğlence için, edboş bir dosya üzerinde çalışmama sorunu olmayan bir çözüm . Bunu, bu sorunun yanıtı gibi bir kabuk betiğine de koyabilirsiniz.

ed Test <<EOF
a

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

Yukarıdaki komut dosyası, ilk satıra eklenecek metni ekler ve ardından birinci ve ikinci satırı birleştirir. Ed'in geçersiz bir birleştirmeyle hatadan çıkmasını önlemek için, önce dosyanın sonunda boş bir satır oluşturur ve varsa daha sonra kaldırın.

Sınırlamalar:<added text> Tek bir döneme tam olarak eşitse bu komut dosyası çalışmaz .


2

benim görüşüm:

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

Eğik çizgi içeren dize bile bu işe yarar "/"


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

İlk önce tacdosyayı geriye doğru (önce son satır) yönlendirir, böylece "eklenecek metin" en son görünür. 2 tacsarar bir kez daha böylece eklenen hat başında ve özgün dosya özgün sırada bulunuyor.


1
Bunun Tomas'a bu konuda nasıl yardımcı olacağını açıklayabilir misiniz?
John Odom

tac | tac - ölçeklenemeyen zihniyet bu şekilde oluşur :-(
Michael Shigorin

0

Takma adlarla başka bir çözüm. İnit rc / env dosyanıza ekleyin:

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

Kullanımı:

addtail "string to add at the beginning of file"
addtail "string to add at the end of file"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.