Komuttan her çıktı satırına önek ve sonek dizeleri


17

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

2
Ayrıştırmamalısın ls- bu kötü juju. Ayrıca, olması gerekiyor grepmu? Bazı örnek çıktılar verebilir misiniz?
Sobrique

1
Dosya adı bir satırsonu içeriyorsa komut dosyanızın ne yapmasını istiyorsunuz?
Tai Viinikka

Yanıtlar:


27

Sed ile:

ls | grep txt | sed 's/.*/prefix&suffix/'

3
Veya, sedbir süper seti olmak grep: ls | sed -n '/txt/s/.*/prefix&suffix/p'veyals | sed -n 's/.*txt.*/prefix&suffix/p'
Stéphane Chazelas

@ StéphaneChazelas: Bu ipucu için teşekkür ederim.
Cyrus

5

İ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 $_.


Variablesed´ kullanarak ilk örneğinizde bir değişkeni sonek / önek olarak nasıl eklerim?
SpecialBomb

Tırnak işaretlerini değiştirin ve sadece em kullanın.
Sobrique

2

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 .
  • MYPATTERN uygun bir POSIX ERE (varsayılan tür Emacs, buraya bakın ), ancak tüm dosya adıyla eşleşmelidir, bu yüzden .*thing.*sadecething
  • Eğer yapabilirsiniz muhtemelen sadece birini kullanın -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.


0

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`/%"
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.