Bash betiği yazmaya çalışırken bir sorunla karşılaştım. grep
Çıkışları, bu döner (genellikle) fazla satır. Önek ve bu çıktı satırlarının her biri için bir dize sonek istiyorum.
Ben de boru ediyorum nota gibi olur ls
içine grep
gibi:
ls | grep
Bash betiği yazmaya çalışırken bir sorunla karşılaştım. grep
Çıkışları, bu döner (genellikle) fazla satır. Önek ve bu çıktı satırlarının her biri için bir dize sonek istiyorum.
Ben de boru ediyorum nota gibi olur ls
içine grep
gibi:
ls | grep
Yanıtlar:
Sed ile:
ls | grep txt | sed 's/.*/prefix&suffix/'
sed
bir süper seti olmak grep
: ls | sed -n '/txt/s/.*/prefix&suffix/p'
veyals | sed -n 's/.*txt.*/prefix&suffix/p'
İle sed
:
ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'
Ancak, bunun satır beslemeli dosya adlarıyla ilgili sorunlardan ve ls
genel olarak kötü bir fikir olan çeşitli ayrıştırma sorunlarından muzdarip olduğunu unutmayın .
Perl ile
perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'
Not - perl grep
, grep
komut gibi bir desen alabilir , ancak dosya testleri uygulama gibi şeyler de yapabilirsiniz.
Örneğin
grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares.
grep
Varsayılan yineleyici içinde $_
geçerli öğe değerine ayarlanır, böylece regex uygulayabilir sed
/ grep
stil uygulayabilir veya dayalı çeşitli görevler gerçekleştirebilirsiniz $_
.
“
ve sadece em kullanın.
Bu durumda GNU find
, tüm bunları tek seferde yapmanıza izin verir, boruları ortadan kaldırır ve aşağıdakileri potansiyel olarak ayrıştırır ls
:
find . -maxdepth 1 -name '[^.]*' \
-regextype posix-extended -regex "MYPATTERN" \
-printf 'SOMEPREFIX %f SOMESUFFIX\n'
( find
tabii ki diğer komutların çıktılarını keyfi olarak değiştirmenin iyi bir yolu değildir!)
Bazı notlar:
-maxdepth 1
ve -name [^.]*
ad eşleşmesinin düz ls
(veya ls .
) ile aynı şekilde çalışmasını sağlayın . Herhangi bir kabuk stili glob kullanabilirsiniz, ancak "*" öğesinin önde gelen "" ile eşleşeceğini unutmayın. bir isimde † aksine bash
, önde gelen "" olmayan herhangi bir [^.]*
şey anlamına gelir ..*thing.*
sadecething
-name
/ -regex
"[^.]. yerine her ikisinin (örn -regex MYPATTERN. "-printf
destekleri çok şeyler , %n
süssüz dosya veya dizin adıdır† (bu, sürümünüze bağlı olabilir
find
, kılavuz sayfanızın "STANDARTLAR UYUMU" bölümünü kontrol edin)
Gerekli harici programlarla olası bir alternatif olarak bash
vardır compgen
bir etmek globs, eşdeğer genişler, diğer şeyler arasında, hangi, ls
hiçbir seçenekleri ile:
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
Bu, dosya adlarını yeni satırlar dahil boşlukla işler. compgen -G "*"
bir düzle aynı çıktıyı sağlamalıdır ls
(ancak bunun ls *
tamamen farklı bir şey olduğunu unutmayın ). Yine de ihtiyacınız olacak grep
ve bu sorunu çözebilir veya çözmeyebilir, ancak söz etmeye değer.
sed
ve find
ön ekiniz / son ekiniz regex anahtar karakterlerini içeriyorsa veya bir ortam değişkenini (bir anlık değer yerine) geçirmek istiyorsanız, xargs
+ echo
burada daha uygun olabilir.
Ortam değişkeni ile:
ls | grep p | xargs -I % sh -c "echo $PATH/%"
Satır içi ile:
ls | grep p | xargs -I % sh -c "echo `pwd`/%"
ls
- bu kötü juju. Ayrıca, olması gerekiyorgrep
mu? Bazı örnek çıktılar verebilir misiniz?