Soru Stdin ve bir dizge nasıl birleştirilir?


Stdin'i bir dizeye nasıl ekleyebilirim?

echo "input" | COMMAND "string"

ve Al

inputstring

76
2017-12-14 18:12


Menşei




Cevaplar:


Biraz hacky, ama bu soruda sorduğun şeyi yapmanın en kısa yolu olabilir (kabul etmek için bir boru kullan stdout itibaren echo "input" gibi stdin başka bir işlem / komuta

echo "input" | awk '{print $1"string"}'

Çıktı:

inputstring

Tam olarak ne yapmaya çalışıyorsun? Daha fazla bağlam, daha iyi bir çözüm için size daha fazla yön sağlayabilir.

Güncelleme - yoruma yanıt verme:

@NoamRoss

İstediğin şeyi yapmanın daha aptalca yolu o zaman:

echo 'http://dx.doi.org/'"$(pbpaste)"

$(...) sözdizimi çağrılır komut ikamesi. Kısacası, yeni bir alt kabuğun içine konan komutları yürütür ve stdout nereden çıktı $(...) ana kabukta çağrıldı. Yani, aslında olsun ki:

echo 'http://dx.doi.org/'"rsif.2012.0125"

82
2017-12-14 18:24



Teşekkürler! Bu harika çalışıyor. Tamamlamaya çalıştığım tam görev, panodan bir dize almak (bir DOI) ve buna bir URL eklemektir. pbpaste | awk '{print "http://dx.doi.org/"$1}'ve Al http://dx.doi.org/10.1098/rsif.2012.0125 - Noam Ross
@NoamRoss güncellenmiş cevap; düzenleme gibi görünüyor;) - sampson-chen
@ sampson-chen kullanırdım '{print $0"string"}' her şeyi kapmak için. - Roman Newaza
Aslında ekliyor string her satıra. Deneyin echo 'input'\n'another line' | awk '{print $0"string"}'. - tomekwi


kullanım cat - stdin'den okumak ve $() sondaki yeni satır atmak

echo input | COMMAND "$(cat -)string"

Ancak neden boruyu düşürmüyorsanız ve sol taraftaki çıkışı bir komut ikamesinde yakalamıyorsunuz:

COMMAND "$(echo input)string"

40
2017-12-14 20:51



İşte pratik bir örnek: bulmak ~ / other_program / lib -name "* .jar" | tr '\ n' ':' | echo "$ (kedi -) ~ / java_app / sınıfları" - Ashwin Jayaprakash
Bu bash benim için çalışıyor, ama zsh "kedi: -: Giriş / çıkış hatası" olsun. Bunun neden olabileceği hakkında bir fikrin var mı? - jaymmer


Genellikle pipo kullanıyorum, bu yüzden stdin'i önek ve sonlandırmak için kolay bir yol olma eğilimindedir:

echo "my standard in" | cat <(echo "prefix... ") <(cat -) <(echo " ...suffix")
prefix... my standard in ...suffix

21
2017-10-15 03:04



Teşekkürler! Bu aslında kullanımının çok güzel bir örneği pipe ve cat - Alex Ivasyuv
Bu en iyi cevap olmalı - Chris Koston
Neden sadece: echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"? Veya daha okunabilir sürüm: echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix" - MiniMax
@MiniMax Cevabın akışlarla iyi çalışması nedeniyle, büyük stdin için çalışacaktır. - anishpatel
@anishpatel Benim sürümüm de büyük stdin için çalışacaktır. Fark yok. - MiniMax


Onu sed ile yapabilirsin:

seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'

Örneğinde:

echo input | sed 's/.*/\0string/'

9
2018-02-15 08:29





Bunu başarmanın bazı yolları var, ben şahsen en iyisi olduğunu düşünüyorum:

echo input | while read line; do echo $line string; done

Bir diğeri, "$" (satır karakterinin sonu) ile "dize" bir sed komutunda yer değiştirerek olabilir:

echo input | sed "s/$/ string/g"

Neden eskiyi tercih ederim? Örneğin, aşağıdaki komutla örneğin bir dizeyi stdin ile birleştirir:

(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done

ilk çıktıyı hemen alırsınız:

input_one string

ve sonra 5 saniye sonra diğer ekoyu alırsınız:

input_two string

Öte yandan "sed" kelimesini kullanarak parantezin tüm içeriğini gerçekleştirir ve sonra "sed" ye verir, böylece komut

(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"

her iki satırı da gönderecek

input_one string
input_two string

5 saniye sonra.

Bu, fonksiyonun çıktısı hakkında sürekli olarak güncellenmesi ve tamamlanması için uzun zaman alan fonksiyonlara çağrı yaptığınız durumlarda çok yararlı olabilir.


8
2017-12-05 12:05



Aslında, sed Seçenek ayrıca her giriş satırını anında işler. - tomekwi


Bunun birkaç yıl geç olduğunu biliyorum, ancak bunu xargs -J seçeneği ile yapabilirsiniz:

echo "input" | xargs -J "%" echo "%" "string"

Ve bu yana olduğu xargs, bunu bir kerede birden çok satırda yapabilirsiniz. 'Adlar' dosyasının üç satırı varsa:

Adam
Bob
Charlie

Yapabilirsin:

cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"

4
2017-09-29 15:50



Dışında serin görünüyor -J standart / ortak görünmüyor. Linux'ta (nerede xargs parçası GNU findutils) Hatayı alıyorum: xargs: invalid option -- 'J' Bu hangi sistemde? - arielf
-J Mac sürümü içindir. Linux için -I aynı işlevi yerine getirir. - user2635263
Teşekkürler! çok kullanışlı. Linux'ta, bu basitleştirilmiş sürümün aynı zamanda çalıştığını lütfen unutmayın: cat names | xargs -I% echo "I like % because he is nice" IOW: gerek yok -n 1 (xargs aramalar echo Yine de, her girdi için bir kere -I ima -L1) Ayrıca, tüm bağımsız arg alıntı, gereksiz gibi görünüyor. - arielf


Gönderdiğiniz komut, "girdi" dizesini, COMMAND'ın stdin akışı olarak kullanır. Bu, COMMAND'ın stdin içeriğini ilk kez bastırmadığı ve daha sonra komut satırı argümanlarını yazdırdığı sürece aradığınız sonuçları üretmez.

Yapmak istediğin şey, komuta ikamesine daha yakın gibi görünüyor.

http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

Komut yerine koyma ile bunun gibi bir komut satırına sahip olabilirsiniz:

echo input `COMMAND "string"`

Bu, ilk önce COMMAND'ı "string" ile girdi olarak değerlendirecek ve ardından bu komutların sonuçlarını bir satır üzerine genişletecek ve ‘` karakterleri arasında kalanları değiştirecektir.


3
2017-12-14 18:23



ve tabii ki @NaomRoss, Bourne kabuğunu kullanmanız veya başka bir "taşınabilirlik" yetkisine sahip olmanız gerekmediği sürece, echo input $(COMMAND "string")backticks yerine. Hepinize iyi şanslar. - shellter


Ayrıca çalışır:

seq -w 0 100 | xargs -I {} echo "string "{}

Aşağıdaki gibi dizeler oluşturur:

string 000
string 001
string 002
string 003
string 004

...


0
2018-04-01 18:31