Yeni satırlarla içeriği unix değişkenine dosya


117

Aşağıdaki içeriğe sahip bir metin dosyası test.txt var:

text1
text2 

Ve dosyanın içeriğini bir UNIX değişkenine atamak istiyorum, ancak bunu yaptığımda:

testvar=$(cat test.txt)
echo $testvar

sonuç:

text1 text2

onun yerine

text1
text2 

Birisi bana bunun için bir çözüm önerebilir mi?

Yanıtlar:


185

Atama yok değil aslında var, yeni satır karakterleri kaldırın echobunu. Bu satırsonlarını korumak için dizenin etrafına tırnak işareti koymanız yeterlidir:

echo "$testvar"

Bu, istediğiniz sonucu verecektir. Demo için aşağıdaki transkripte bakın:

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2

Nedeni yeni satırlar boşluk ile değiştirilir neden değil tamamen ilgisi echodaha çok şeylerin bir kombinasyonu, komuta.

Bir komut satırı verildiğinde bash, IFSdeğişkenin belgelerine göre onu kelimelere ayırır :

IFS: Genişletmeden sonra sözcük ayırma için kullanılan Dahili Alan Ayırıcı ... varsayılan değer şudur <space><tab><newline>.

Bu, varsayılan olarak, bu üç karakterden herhangi birinin komutunuzu ayrı kelimelere bölmek için kullanılabileceğini belirtir. Ondan sonra, kelime ayırıcılar gitti, kalan tek şey bir kelime listesi.

Bunu echobelgelerle birleştirin ( bashdahili bir komut) ve boşlukların neden çıktı olduğunu göreceksiniz:

echo [-neE] [arg ...]: Boşluklarla ayrılmış bağımsız değişkenleri , ardından bir satırsonu ile çıktılar .

Kullandığınızda echo "$x", tüm xdeğişkeni göre tek bir kelime olmaya zorlar bash, dolayısıyla bölünmez. Bunu şununla görebilirsiniz:

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

Burada countişlev , verilen bağımsız değişkenlerin sayısını yazdırır. 1 2 3Ve a b c dvaryantları eylem göstermek.

Sonra bunu değişken üzerindeki iki varyasyonla deneriz x. Tek olmadan dört kelime vardır tırnak gösterileri, "test", "1", "test"ve "2". Tırnak ekleme yapar bir tek kelime "test 1\ntest 2".


Alıntılar ... eksik olan buydu! Teşekkürler!
anonim

Ayrıca kayda değer: Sonraki satırlar, komut ikame operatörünün kendisi tarafından kaldırılacaktır: Çevrimiçi deneyin!
Jonah

11

Bu, satırsonu içeren IFS (Dahili Alan Ayırıcı) değişkeninden kaynaklanmaktadır.

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

Geçici bir çözüm, IFS'yi yeni satırı içermeyecek şekilde geçici olarak sıfırlamaktır :

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

IFS için bu korkunç değişikliği GERİ DÖNMEK için:

IFS=$IFSBAK

Bu değişikliği yaptım ama şimdi diğer şeylerim çalışmıyor, lütfen sıfırlamamı söyleyin.
Pooja25

Bir değişkene gitmeniz gerekmiyorsa, doğrudan tek echo "$(IFS=''; cat text.txt)"
satırlık


3

Birisi başka bir seçenekle ilgileniyorsa:

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done

3

Değişkeniniz tarafından doğru bir şekilde ayarlandı testvar=$(cat test.txt). Yeni satır karakterlerinden oluşan bu değişkeni görüntülemek için, basitçe çift tırnak ekleyin, örn.

echo "$testvar" 

İşte tam örnek:

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2

0

Yardımcı envdirprogram, bunu yapmanın kolay bir yolunu sağlar. envdirortam değişkenlerini temsil etmek için dosyaları kullanır; dosya adları env var adlarıyla ve dosya içeriği env var değerleriyle eşleşir. Dosya içeriği satırsonu içeriyorsa, env var.

Bkz. Https://pypi.python.org/pypi/envdir

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.