Bash'deki çoklu metin dosyalarının başına ve sonuna nasıl metin eklerim?


24

Metin dosyaları ile dolu bir dizin var. Amacım, hepsinin başına ve sonuna metin eklemektir. Her dosya için başında ve sonunda yer alan metin aynıdır.

Web'den aldığım kodlara göre, dosyanın başına eklenecek kod budur:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

Dosyanın sonuna eklenecek kod budur. Amaç, metni };her dosyanın sonuna eklemektir :

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

Çektiğim örnekler bireysel dosyalar üzerinde çalışmaktı. Joker karakterini kullanarak birden fazla dosya üzerinde oynamaya çalışacağımı düşündüm *.txt.

Ben de başka hatalar yapıyor olabilirim. Her durumda, birden çok dosyanın başına ve sonuna nasıl metin eklerim?

Yanıtlar:


27

Kullanabileceğiniz bir dosyaya metin hazırlamak için (GNU uygulamasıyla sed):

sed -i '1i some string' file

Metin eklemek kadar basit

echo 'Some other string' >> file

Yapmanız gereken son şey, düzenlemek istediğiniz tüm dosyalar üzerinde yinelenen bir döngüye koymaktır:

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done

8

GNU sed kullanabilirsiniz

Daha önce gösterildiği gibi, sırasıyla ve komutunu sedkullanarak bir dosyanın satırlarını hemen önce ve sonra eşleştirerek metin satırları ekleyebilirsiniz . Daha önce gösterilmemiş olan şey, tek bir astarla ve aynı anda birden fazla dosya için yapabilmenizdir .ia

Aşağıdaki, ilk satırdan önce 1ive son satırdan sonra bir satır ekleyecektir $a. Eklemeler, dünya ile eşleşen tüm dosyalar için yürütülür *.txt.

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

Hem ive asadece satır numaraları ile işi değil, aynı zamanda belirli bir kalıpla eşleşen her satırda yapmak. Bu ne zaman bir satır içerdiyse bir yorum ekler var y = 2;:

sed -i -- '/var y = 2;/i//initialize variable y' *.js

5

Tamamen POSIX uyumlu komut kullanarak ex:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

printfKomutun bir kısmını kendi başına çalıştırırsanız, tam olarak verildiği düzenleme komutlarını göreceksiniz ex:

0a
var language = {
.
$a
};
.
x

0a"0 satırından sonra metin ekle" anlamına gelir (diğer bir deyişle ilk satırdan önce). Bir sonraki satır, 0 satırından sonra "eklemek" için hazır bilgi metnidir .. Bir satırdaki nokta ( ), eklenecek metni sonlandırır.

$a Dosyanın son satırından sonra metin eklemek anlamına gelir.

x değişiklikleri kaydetmek ve çıkmak anlamına gelir.


2

İşte Perl'de yapmanın bir yolu:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done

@ StéphaneChazelas ekleyerek -ibu dosyayı ikamesi yerine gelmez değil iş, sadece stdout'a yazdırır.
Oleh Prypin

@OlehPrypin, gerçekten de haklısın. Yorum silindi.
Stéphane Chazelas

1

Kullanmayı deneyin ex:

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

komutlar nerede:

  • bufdo!Her açılan tampon / dosya için aşağıdaki komutları uygular (not: POSIX değil )
  • 1s/^/HEAD/- HEADsatırın başındaki ilk satıra metin ekler
  • $s/$/TAIL/- TAILsatırın sonundaki son satırı metin ekler

ve argümanlar:

  • -s - sessiz / hızlı mod
  • -cxa - tüm açılmış arabellekleri / dosyaları kaydet ve çık
  • *.foo- Mevcut dizindeki tüm dosyaları ( *birlikte) foouzantısı, kullanım **/*.foorecursivity için (globstar etkinleştirdikten sonra: shopt -s globstar)


1
@StevenPenny haklı. POSIX tarafından belirtilen özellikleri yalnızca kişisel olarak komut dosyası düzenlemeleri için kullanıyorum.
Joker,

1

Eklentiyi gnu awkkullanarak inplaceve BEGINFILE/ ile ENDFILE:

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt

1

Ayrıca ( .outdosyalardaki sonuçlarla ) olma hakkına sahiptir :

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

Sonuçlarla değiştirilen daha ayrıntılı bir başka değişken - kaynak dosyası:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print

0

Kurtarmaya bir astar Perl:

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
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.