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 lsiçine grepgibi:
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 lsiçine grepgibi:
ls | grep
Yanıtlar:
Sed ile:
ls | grep txt | sed 's/.*/prefix&suffix/'
sedbir 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 lsgenel 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, grepkomut 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.
grepVarsayılan yineleyici içinde $_geçerli öğe değerine ayarlanır, böylece regex uygulayabilir sed/ grepstil 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'
( findtabii ki diğer komutların çıktılarını keyfi olarak değiştirmenin iyi bir yolu değildir!)
Bazı notlar:
-maxdepth 1ve -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. "-printfdestekleri çok şeyler , %nsü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 bashvardır compgenbir etmek globs, eşdeğer genişler, diğer şeyler arasında, hangi, lshiç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 grepve bu sorunu çözebilir veya çözmeyebilir, ancak söz etmeye değer.
sedve 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+ echoburada 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ı gerekiyorgrepmu? Bazı örnek çıktılar verebilir misiniz?