Belirli bir satırı metin dosyasında komut olarak nasıl çalıştırabilirim?


11

Bazen bir kabuk komut dosyasında olan tek bir komut yürütmek gerekir.

sed -n 'line_num p'Bu satırı yazdırabileceğini zaten biliyorum . Ancak, yazdırılan belirli satırı komut olarak nasıl yürütebilirim?

Yanıtlar:


10

Bu adamı dene =):

sed -n 'line_num p' | bash

veya

"$(sed -n 'line_num p')"

@mikeserv Kendi eğitimim için bu ifadenin içeriğini bilmek istiyorum.
Bratchley

Gerek arasına boşluk koymak line_numve pböylece örneğin eğer line_num123 ise, o zaman yapabilirsiniz sed -n 123p | bash. Ve eğer shyeterliyse, sadece shyerine kullanın bash.
janos

Yani, sed -n 'line_num p' | shbaşka bir çözüm olabilir mi? Bunun daha fazla uyumluluğu var mı?
Zen

1
@Zen - bu komut dosyası için hangi kabuğun hedeflendiğine bağlıdır. Ayrıca, kabuğun shgerçekte ne olduğuna da bağlıdır . Debian (ve türetilmiş) sistemlerde shgenellikle vardır dash. Komut dosyası için yazılırsa dash (veya taşınabilir sözdizimine bağlıysa), muhtemelen, evet, ancak yazılırsa bashneredeyse kesinlikle değil.
mikeserv

Bu, geçmiş dosyasıyla yapılabilir mi, eğer koşarsam historyve 900 hattını çalıştırmak istediğimi görürsem, 900 hattını bir şekilde çalıştırabilir miyim?
codecowboy

3

Bunu etkileşimli olarak yapıyorsanız, satırı bash tarihine yazabilirsiniz:

history -s "$(sed -n 'line_num p')"

Sonra Entersatırı okuma satırı arabelleğine eklemek ve yürütmek için tuşuna basın ; bu size geç olmadan çizgiye bakma şansı verir.


Bu oldukça zekice ve muhtemelen iyi bir varsayım.
mikeserv

Bu -s seçeneği burada ne anlama geliyor? Açıklamaları bulamıyorumman history
Zen

@zen: historyyerleşiktir, bu nedenle belgelenmiştir help history(veya man bashbu çok fazla okuma). Yukarıdakilerden alıntı yapıldığında, history -s"ARG'leri geçmiş listesine tek bir giriş olarak ekleyecek"
rici

2

Yapabilirsin...

{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"

Bu $NUM, kabuk değişkenindeki komut dosyanızdan yalnızca satırı alır $lineve geçerli kabukta bir komut olarak değerlendirir.

Bunu yapmanın başka bir yolu şöyle görünebilir:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"

1
'eval', 'kötülük'ün ortak bir yanlış yazımıdır. Eval cevabı ise, kesinlikle yanlış soruyu soruyorsun. Bkz. Mywiki.wooledge.org/BashFAQ/048
Gilles Quenot

1
Evet. Herkes sever eval.
mikeserv

gnu sedvardır ebir şey gibi pek bayrağı sed "${NUM}"'!d;s/^//e;q'da iş olur
don_crissti

2

Senaryonuzu vim ile düzenliyor musunuz (Linux'ta vi)? Vi'de bir eşleme ekleyin:

:nmap <F4> Y:!<C-R>"<C-H><CR>

ve daha sonra vi tuşuna basın.


-2

Bash'de aşağıdaki komutu çalıştırabilirsiniz:

for line in $(cat file.txt); do command $line; done
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.