Sed yerine bir dosya değişkenini kullanın


30

Bunun mümkün olduğu söylendi, ancak tek bir çalışma örneği sedolmadan, bir giriş dosyasına ihtiyaç duymadan bir dize değişkeninden okuyabiliyordu. Çalışması için henüz elimde değil. Genel güvenlik için, $PATHdeğişkeni başka bir değişkene yazıyorum, bununla karıştığım için, çünkü tam olarak nasıl yapacağımı bilene kadar ortaya çıkacak başka sorunlara ihtiyacım yok.

Aşağıdakileri göz önünde bulundur:

~$x=$PATH
~$sed -i 's/:/ /g' $x

Bu ile başarısız olur: Böyle bir dosya veya dizin yok.

İşte denediklerimden bazıları:

~$ sed -i 's/:/ /g' | (read x) 
sed: no input files
~$ sed -i 's/:/ /g' | (read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' | $(read x) 
sed: no input files
~$ sed -i 's/:/ /g' | $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' < $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
bash: $(read $x): ambiguous redirect
~$ sed -i 's/:/ /g' < read $x 
bash: read: No such file or directory
~$ sed -i 's/:/ /g' < (read x) 
bash: syntax error near unexpected token `('
~$ sed -i 's/:/ /g' < $((read x)) 
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: syntax error: operand expected (error token is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' < $((read $x)) 
bash: read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: division by 0 (error token is "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' << $((read $x)) 
> ;^C
~$ sed -i 's/:/ /g' << $(read $x)
> ;^C
~$ sed -i 's/:/ /g' $x
sed: can't read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < $x
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < echo $x
bash: echo: No such file or directory
~$ sed -i 's/:/ /g' |  echo $x
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
sed: no input files

Bu işe yarayabilir mi? Sadece sed kullanabilmek için ihtiyacım olmayan dosyaları yazmaya ihtiyacım yok. Bu özel örnek için, ~$x=$PATH ~$sed -i 's/:/ /g' $xaslında umduğum gibi çalışmış olsaydım, şunu alırdım:

/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games

hangi bir değişkene atayabilir ve ilerideki komutlarda ls $x


1
x=$(echo "$x" | sed 's/:/ /g')?
heemayl

Yanıtlar:


16

Olabilir:

~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games

@jOh --- sedburada "string değişkeni" (?) üzerinde çalışmadığını, fakat --- standart girdide (hangisi olması gerektiği) çalıştığını fark edin.
Rmano

Bence sed
sedlere

4
@ j0h bunun ilgisi yok sed, kabuğun girdiyi nasıl yönlendirdiği sorusudur. sedgirdi akışlarıyla ilgilenir ve bunları standart girdi yoluyla okur. Dosya olup olmadıkları önemli değildir. Standart girdiden geldiği sürece her şeyi kabul edebilir.
terdon

38

Bunun, bununla hiçbir ilgisi yoktur sed, standart girdi okuyan herhangi bir program için geçerlidir. Neyse, aradığın şey

sed 's/:/ /g' <<<"$PATH"

Başka bir değişkende saklamak için hiçbir neden yoktur, bu şekilde yaptığınız hiçbir şey değişkende depolanan değeri etkilemez. Bunun için atama operatörüne ( =) ihtiyacınız var. Yukarıda kullanılan sözdizimi "here string" olarak adlandırılır ve bash, ksh ve zsh'ye özgüdür. Bir değişkenin değerini girdi olarak, standart girdiden okuyan bir programa iletilmesine hizmet eder.

U&L hakkında, bunun gibi tüm çeşitli kabuk operatörlerini listeleyen bir cevap yazdım . Bakmak isteyebilirsin.

Yapabileceğinizi de unutmayın

echo "$PATH" | sed 's/:/ /g' 

Sonunda, bunun için gerçekten hiç ihtiyacınız yok sed. Her şeyi doğrudan bashta yapabilirsiniz:

echo "${PATH//:/ }"

Yukarıdaki bir bash değiştirme yapısıdır. Bir değişken $var, bir desen patve bir değiştirme ( rep) verildiğinde , tüm oluşumlarını değiştirmek patiçin rep,

echo "${var//pat/rep}"

Tek eğik çizgiyle aynı şey yalnızca ilk oluşumun yerini alır:

echo "${var/pat/rep}"

2
'Bash değiştirme yapısı' için teşekkürler. İlk argümanı sonraki parametrelere dönüştürmek için Bash fonksiyonunda "$ {1 / from / to}" kullanabildim.
AAAfarmclub 14:17
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.