Eko kullanırken yeni satırlar nasıl eklenir


42

Aşağıdaki komut neden oluşturulan dosyaya yeni satırlar eklemiyor ve bunun çözümü nedir?

$ echo "Line 1\r\nLine2" >> readme.txt

$ cat readme.txt 
Line 1\r\nLine2

6
echozorunlu? kullanabilirsiniz printf.
Archemar

Printf hakkında bilmiyordum, printf ile çalışıyor: P ... peki o zaman echo ile çalışmayan ne yapar?
Saeid Yazdani

Çıktıya \rdahil CRLFedilmek mi yoksa newline'in bir parçası mı?
cuonglm

9
echoBirbiriyle uyumlu olmayan birçok farklı komut uygulaması vardır . Bu nedenle, daha standart bir araç kullanılması tavsiye edilir printf. Sorunun daha fazla gözden geçirilmesi için unix.stackexchange.com/questions/65803/… adresine bakın .
jimmij '

Yanıtlar:


38

echo


echoTek Unix Spesifikasyonuna kesinlikle uyan bir uygulama, aşağıdakileri yaparsanız yeni satırlar ekleyecektir:

echo 'line1\nline2'

Ancak bu güvenilir bir davranış değildir. Aslında, orada gerçekten değil Eğer bekleyebilirsiniz herhangi bir standart davranış echo.

işlenenler

string

Standart çıktıya yazılacak bir dize. İlk işlenen ise -nveya işlenenlerden herhangi biri bir < \ters eğik çizgi> karakteri içeriyorsa , sonuçlar uygulama tarafından tanımlanır .

On XSI conformant ilk işlenen ise sistemlerin, -nbu bir dize olarak ele alınacaktır bir seçenek değil . Aşağıdaki karakter dizileri, herhangi bir argümandaki XSI uyumlu sistemlerde tanınır:

\a- Bir <alert> yazın .

\b- Bir <backspace> yazın .

\c- Aksi halde çıktıdaki son argümanı izleyen <newline> işaretini kaldırın . \cArgümanları takip eden tüm karakterler göz ardı edilir.

\f- Bir <biçim beslemesi> yazın .

\n- Bir <newline> yazın .

\r- Bir <araba-dönüş> yazın .

\t- Bir <tab> yazın .

\v- <vertical-tab> yazın .

\\- Bir <backslash> karakteri yazın.

\0num- Sıfır, bir, iki veya üç basamaklı sekizlik sayı olan 8 bitlik bir değer yazın num.

Ve bu nedenle, yeni bir satır yazmayı bilmenin genel bir yolu yoktur echo, ancak genel olarak sadece bunu yapmakta güvenebilirsiniz echo.

Bir bashkabuk tipik gelmez değil şartnameye uygun ve kolları -nbelirsiz olduğunu bile ve diğer seçenekleri ama. Yapabilirsin:

shopt -s xpg_echo
echo hey\\nthere

hey
there

Yapma zamanı seçeneğiyle oluşturulmuşsa , bu gerekli de değilbash ...

--enable-xpg-echo-default

Make echoyerleşik gerektirmeden, varsayılan olarak ters eğik çizgi bulunan karakterleri genişletmek -eseçeneği. Bu setler varsayılan değeri xpg_echoKabuk seçeneği onBash yapar, echodaha Tekli Unix Şartnamede belirlenen sürümü, sürüm 3. Bkz gibi davranacaksan Bash Yerleşikleri kaçış dizilerinin açıklaması için, echotanır.


printf


Öte yandan, printfdavranışları karşılaştırıldığında oldukça evcildir.

GEREKÇE

Bu printfyardımcı program, tarihsel olarak sağlanan işlevselliği sağlamak için eklenmiştir echo. Bununla birlikte, mevcut çeşitli versiyonlarındaki uzlaşmaz farklar nedeniyle echo, versiyonun özellikleri, printfDokuzuncu Baskı sistemindeki birine dayanan bu yeni yardımcı programa bırakılarak, birkaç özel özelliğe sahiptir .

EXTENDED DESCRIPTION bölümü printf(), XBD Dosya Formatı Notasyonu'ndaki dosya formatı notasyonu ile açıklandığı halde, neredeyse ISO C standardındaki fonksiyonla tam olarak eşleşir .

Argümanlarını tanımlayan format dizgilerini kullanır - ki bunlar herhangi bir sayıda şey olabilir, ancak dizgiler için ya %byte dizgileri veya değişmez %sharfleri vardır. %fİlk argümandaki ormatlardan başka, en çok %byte string argümanı gibi davranır, bunun dışında kaçışa cevap vermemesi \cdışındadır.

printf ^%b%s$ '\n' '\n' '\t' '\t'

^
\n$^    \t$

Neden daha printfiyi olduğunuecho görün ? daha fazlası için.


echo() printf


Kendi standartlarını şöyle yazabilirsin echo...

echo(){
    printf '%b ' "$@\n\c"
}

... hemen hemen her zaman otomatik olarak doğru olanı yapmalı.

Aslında, hayır ... \nSon argüman tek bir <backslashes> sayısıyla bitiyorsa, bu, argümanların kuyruğunda değişmez bir yazı oluşturur .

Ama bu değil:

echo()
    case    ${IFS- } in
    (\ *)   printf  %b\\n "$*";;
    (*)     IFS=\ $IFS
            printf  %b\\n "$*"
            IFS=${IFS#?}
    esac

Varsayılan olarak kullanılacak shopt -s xpg_echoseçenek için +1 . echo-e
Vignesh Raja

Bu çözüm onsuz çalışmıyor -e. Hiç kimse, belki de @HaydeSchiff
ha9u63ar

@ ha9u63ar - uhh ... bunu okudun mu?
mikeserv

27

"\ R \ n" gibi kaçış karakterlerini ayrıştırmak için -e bayrağını iletin, şöyle:

echo -e "Line 1\r\nLine2" >> readme.txt

Kaçış dizilerinin çalışmasını sağlamak için basit, basit bir "-e" seçeneği - echogüvenilmez olan ve aksine standartlara uymayan başka bir cevapta yazıyor printf.
Edward

1
Komut dosyanızın komut gibi herhangi bir değişmez \ r \ n içermediğinden emin olun tr -d "\n".
Noumenon

8

Kullandığım tüm bash sürümlerinde, dizgeye yeterince alıntı yapılması şartıyla, bir dizgeye etkileşimli olarak veya bir betiğe basit bir yeni satır ekleyebilirsiniz.

Etkileşimli:

$ echo "Line one
> Line two"
Line one
Line two
$

Bir komut dosyasında:

echo "Line one
Line two"

4
echo -e "Line 1\r\nLine2" >> readme.txt

daha fazla kullanım olanakları:

man echo

2

İnsanlar zaten yeterince cevap verdiler ancak yankıdan başka bir seçeneği kabul ettiği bir dünyayı kabul etmeyi reddediyorum -n.

nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3

1

Mesajın bir parçası olmayan bir karakteriniz varsa,

$ echo "Time on the next line:@$(date +"%Y-%m-%dT%T%z")" | sed -e's/@/\n/g'
Time on the next line:
2016-03-25T10:12:39-0500
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.