Bir dize ilk kelimesini nasıl elde edilir?


43

Ne zaman 'echo *' aşağıdaki çıktıyı almak:

file1 file2 file3 ...

İstediğim ilk kelimeyi seçmek. Nasıl devam edebilirim?


1
@ mattdm lsDosya adlarından biri boşluk içeriyorsa, kullanma çalışmaz.
yardımcılar

2
Kelimeyi nasıl tanımlarsın ? İlk dosya ise Sunset on a beach.jpg, Sunsetdosya adı mı yoksa tam adı mı olmalı ? Ne hakkında Sea, sex and sun.ogg? Sea, Sea,Ya da bütün dosya adı?
Stéphane Chazelas

@mattdm ls | head -1bana a.patch p.pyilk kelime olmayan, hatta dosyaları bile alfabetik sıraya göre rastgele şeyler veriyor .
phuclv

Yanıtlar:


52

Bunu awk aracılığıyla yönlendirebilir ve ilk sözcüğü eko haline getirebilirsiniz

echo * | head -n1 | awk '{print $1;}'

veya ipi kesip ilk kelimeyi seçersiniz:

echo *  | head -n1 | cut -d " " -f1

ya da onu sımsıkı sarın ve ilk kelimeden başka her şeyi çıkarmasını sağlayın.

echo * | head -n1 | sed -e 's/\s.*$//'

Eklenen | head -n1tatmin nitpickers için. Dizenizde yeni | head -n1çizgiler varsa, önemli komutlar kendisine iletilen dizeden ilk sözcüğü seçmeden önce ilk satırı seçecektir.


1
İlk kelimeyi değil, her satırın ilk kelimesini döndürürdüm.
Stéphane Chazelas

2
kaç tane hat echo *ürettiğini merak ediyorum
Bananguin

Bu, kaç dosyanın adında yeni satır karakterleri olduğuna veya ortama veya bash öğesinin nasıl derlendiğine veya listede bazı dosyaların -eveya -ee... olarak görünüp görünmemesine, dosya adında kaç kez \ngöründüğüne bağlıdır. Eğer adı verilen bir dosya varsa -n, hiçbir satır bile geri
gelmeyebilir

Eh, biz hala bash konuşuyoruz ve 1. genellikle bash yeni satırları yeni satırlarla tek bir satır olarak geçmez 2. bir dosya adında yeni bir satır olması çok zor ve sıradışı (imkansız mı?) bir dosya ismi \ \ 4. olarak görünecektir. 3, - ile başlayan dosya isimlerini tutar. en az bir dize, bunun için 6. en azından çok satırlı sorunla ilgilenme tavsiyemi değiştirdim
Bananguin

1
Tüm 5 puan yanlıştır. Boş bir dizinde dene: touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l'( Unix'e uygun olması gereken xpg_echoyerlerde etkindir bash). Ve bir başka boş dizinde: touch ./-n; bash -c 'echo * | wc -l'. Satır, yeni satır karakteri ile sonlandırılan bir karakter dizisidir. Eğer echoyeni bir satır karakteri çıkarmazsa, herhangi bir satır çıkarmaz. Metin araçlardan Davranışı gibi cut, awkya da sedson satır karakteri ve davranışları uygulamaları arasında değişiklik sonrasında giriş ekstra karakterler varsa belirtilmemiştir.
Stéphane Chazelas

18

Posixy bir kabuk varsayarak ( /bin/shveya /bin/bashbunu yapabilir)

all=$(echo *)
first=${all%% *}

Yapı ${all%% *}, alt zarı çıkarma örneğidir . Bu %%araç *, değişkenin sağ ucundan en uzun eşleşmeyi (bunu izleyen bir boşluğu) siler all. Sen dize manipülasyon hakkında daha fazla bilgi bulabilirsiniz burada .

Bu çözüm, ayırıcının bir boşluk olduğunu varsayar. Bunu dosya adları ile yapıyorsanız, boşluk içeren herhangi biri onu kıracak.


Güzel. Ama basit ve daha da kesilmez olan diğer versiyonunu sevdim headvecut
Anwar

4
IMO, kafa, kesim ve sed daha az basittir. Yerleşik parametre değiştirme işlemi işi verimli bir şekilde yaptığında neden başka bir araç ortaya çıkıyor? Bu cevap, boşlukla ayrılmış kelimelerin listesinin ilk kelimesini seçmenin en etkili ve en taşınabilir yoludur.
Juan

7

Eğer gerçekten ilk istediğimizi varsayalım, dosya adını ve ilk sözcüğü , boşluk bulunduğunda üzerinde kesilmez bir yolu şudur:

shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"

1
İlk kelime de kolay olurdu:files=($(echo *))
Hauke ​​Laging

2
"-N", "-e", "-ne", "-Enenene" ... ve nasıl bashderlendiğine veya çevreye bağlı olarak , muhtemelen ters eğik çizgi karakterlerine bağlı olacaktır.
Stéphane Chazelas

2
@HaukeLaging, globbing'i devre dışı bırakmanız gerekir. Gibi: text=$(echo *); set -f; files=($text)aksi takdirde daha fazla joker genişletilebilir.
Stéphane Chazelas

3
vefiles=$(echo *); echo ${files%% *}
vdegenne

1
@memnoch_proxy Beyaz boşluk içeren dosya adlarını kırar, dikkatli kullanır.
Chris Down

5

Konumsal parametreleri kullanabilirsiniz

set -- *
echo "$1"

3
Bunun, yardımcı bir kapsamda çalıştırılmadıkça, betiğinizle ilgili diğer tüm argümanları yok edeceğini unutmayın. Ayrıca *dizinde dosya yoksa, genişletilir .
Chris Down

shopt -s nullglobhalledecekti
glenn jackman

3

Aşağıdaki alternatiflerden birini kontrol edin:

$ FILE=($(echo *))
$ FILE=$(echo * | grep -o "^\S*")
$ FILE=$(echo * | grep -o "[^ ]*")
$ FILE=$(find . -type f -print -quit)

Sonra üzerinden yazdırabilirsiniz echo $FILE.

Ayrıca bakınız: grepçıktıdaki ilk ilk kelime?



1

İlk dosya adını aldım:

shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
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.