Ayrıntıları bir dosyadan seçmeli olarak kopyalayıp yeni bir dosyaya nasıl yapıştırabilirim?


11

Kişisel bilgilerimi (.txt) içeren bir dosyam var. Terminal üzerinden dosyadan yalnızca birkaç ayrıntıyı nasıl kopyalayabilir ve bunları yeni bir .txtdosyaya nasıl koyabilirim ?

Örneğin, dosyanın içeriği buysa:

name : farah age : 23 phone number : 0123 education : degree

yalnızca yaş ve telefon numarasını nasıl kopyalayabilir ve bunları yeni bir .txtdosyaya nasıl verebilirim ?


2
Yeni dosyaya neyin kopyalanmasını istediğinize bağlıdır. İlk birkaç satırı, son birkaç satırı, bir dize içeren, bir dize içermeyen satırları, iki dize arasındaki satırları ister misiniz? Tüm bunları yapmak için araçlar var, ama ne yapmak istediğinizi bilmemiz gerekiyor.
Arcege

Yanıtlar:


7

Bunu yapmanın birkaç yolu vardır. Dosyanızda bilinen bir yapı varsa kullanabilirsiniz grep. grepKomut aramalar o ifadeyle eşleşen belirli ifade ve iadeler hatları için bir dosya. Dosyanız şöyle görünüyorsa

İsim: Sally

Doğum Tarihi: 7.31.76

Adres: 1234 Ana Cadde

SSN: 123-45-6789

koşabilirsin grep Name info.txtve geri dönecek Name: Sally. Ardından çıktıyı başka bir dosyaya yeniden yönlendirebilirsiniz . Yani

grep Name info.txt > info2.txt

satırı yeni info2.txt dosyasına gönderir. Yeni satırlar eklemek istiyorsanız,

grep Address info.txt >> info2.txt

aksi takdirde dosyanın üzerine yazılır.

Ayrıca vim gibi bir komut satırı metin düzenleyicisi kullanmayı da öğrenebilirsiniz .


2

Sen kullanabilirsiniz grep bir aramak için düzenli ifade içinde details.txt ve yeni bir dosyaya sonucu yönlendirir.

Kopyalamak istediğiniz tüm satırların ortak bir yanı varsa diğer satırları kullanamazsınız:

grep "string in common" details.txt > new.txt

Değilse, yine de grep kullanarak kopyalamak istediğiniz her satırı aramak ve yerine kullanarak new.txt dosyasına eklemek zorunda kalacaksınız .>>>


1

Terminalde çalışan editörler de var, örneğin nano, vi ve emacs.

Yerel makinenizde bir grafik kullanıcı arabirimi ve uzak bir makinede bir terminal kullanıyorsanız, fareyi bir terminal penceresinden / sekmesinden diğerine kopyalayıp yapıştırmak için de kullanabilirsiniz.


1

Girdi dosyasının details.txtiçerdiği varsayılarak :

name: farah
age: 23
phone number: 0123
education: degree

genişletilmiş grep ile "ad" ve "telefon" satırlarını seçebilir ve çıktıyı new.txt'ye yönlendirebilirsiniz:

grep -E "age:|phone number:" details.txt > new.txt

Bu, new.txt ile aşağıdakileri üretecektir:

age: 23
phone number: 0123

Nasıl çalışır:

Grep yalnızca eşleşen satırları yazdırır. -ESeçenekler kullanımı size imkanı verir genişletilmiş Regexp'i etkin |(alternatif). Tüm deseni alıntılamayı unutmayın, bu yüzden |grep tarafından yorumlanacaktır. Aksi takdirde kabuk yorumlamaya çalışacaktır. Bunu burada istemiyorsun.


1

Gösterdiğiniz dosyada tüm ayrıntılar tek bir satırda bulunur:

name : farah age : 23 phone number : 0123 education : degree

age :Komuta vb. Gibi sabit kodlama yapabileceğinizi varsaydım , ancak onu takip eden metin değişecektir ve ayrıntılar verilen sırada olmayabilir veya bitişik olmayabilir.

Sen doğrultusunda parçalarını ayıklamak grepbireyin -obayrağı. Bu, tüm satır yerine yalnızca eşleşen kısmı yazdırır.

age :Ve phone number :bölümlerini dahil etmek istiyorsanız, -ebirden çok eşleşme belirtmek için bayrağı veya alternatifi kullanabilirsiniz.

$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123

İfade [^ ]*, boşluk olmayan herhangi bir sayıda karakter anlamına gelir, bu nedenle bir age :sonraki boşluğa kadar olan karakterlerle eşleşir .

fileAyrıntılarınızı içeren dosyanın adıyla değiştirin . Çıkışı >operatörle yeni bir dosyaya yeniden yönlendirerek şöyle yazabilirsiniz :

grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile

Bunu yaptığınızda, herhangi bir çıktı görmezsiniz. Önce çıkışı kontrol etmeli, ardından yeniden yönlendirme eklemelisiniz.

İşte değişimli örnek. Biz kullanmak -Eanlatmak için bayrak grepgenişletilmiş normal ifade kullanma. Sözdizimi (pattern1|pattern2)- bu pattern1ve / veya eşleşir pattern2. İkisinden biri bulunursa, yazdırılır (diğerinin bulunup bulunmamasına bakılmaksızın). Şimdi +, önceki karakterin *sıfır veya daha fazla anlamı yerine önceki karakterlerden en az birinin anlamını kullanıyorum . Bu bağlamda, ikisi de eşit derecede iyi çalışır.

$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23 
phone number : 0123 

age :Ve phone number:parçalarını atlamak istiyorsanız, Perl uyumlu normal ifadeleri kullanmayı -Pistemek grepiçin bayrağı kullanabilirsiniz. Bu, alternatifi ve ayrıca belirli bir kalıptan sonra metni eşleştirme yolunu destekler :

$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123

Metni farklı biçimlendirmek istiyorsanız, sedörneğin şunları kullanabilirsiniz :

$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123

Bu daha ageönce gelmeye bağlıdır phone number, bu yüzden durum böyle değilse ayarlayın. Siparişe güvenemezseniz, bu çok kıvrımlı komutu kullanabilirsiniz:

$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23

Bu, çizgiyi phone number :bölümün her satırda önce geleceği şekilde yeniden düzenler , ardından istenen ayrıntıları seçmek için ikinci bir değiştirme yapar. Burada kullanılan tekniği muru tarafından bu cevaba borçluyum .

sedÖnceki açıklamaların kapsamadığı komutlarla ilgili notlar

  • -r(GNU daha okunabilir komutlar için genişletilmiş düzenli ifade kullanmak sedanlar -Eaynı anlama gelen)
  • s/old/new/yerine oldsahipnew
  • (pattern)veya vb. patternile daha sonra başvurmak üzere kaydeder (yakalama gruplarının oluştuğu soldan sağa sıraya karşılık gelir - bunlardan yalnızca 7 tanesine kadar not alın !).\1\2sed
  • .bu nedenle herhangi bir karakteri .*temsil eder.
  • ; kabukta olduğu gibi komutları ayırır.
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.