GNU sed, POSIX sedve BSD'nin sedsayısız seçenekleriyle kafam karıştı . \nBu üç sedtürü kullanarak değişmezi newline karakteriyle nasıl değiştiririm ?
foo\\nbarda gibi girişlerde ne olmak istiyorsun foo\\\nbar?
GNU sed, POSIX sedve BSD'nin sedsayısız seçenekleriyle kafam karıştı . \nBu üç sedtürü kullanarak değişmezi newline karakteriyle nasıl değiştiririm ?
foo\\nbarda gibi girişlerde ne olmak istiyorsun foo\\\nbar?
Yanıtlar:
sed 's/\\n/\
/g'
Yedek dizgede dönüşe çarpmadan hemen önce ters eğik çizgiye dikkat edin.
sed1979'da Unix v7'deki orijinal komutla çalıştı . İşe yaramayacak tek yer, sedbazı çıkarılmış meşgul kutu tabanlı olanların POSIX dışı soyulmuş uygulamaları olacaktı . Bu csh içinde işe yaramaz ama bu bir csh sorunu.
\\narama bölümü kullanılır, neden kullanmayın \nyerini de? İlki, var olanı ima ediyor gibi görünüyor. yani. neden bu değil$ echo '1\n2'|sed 's/\\n/\n/g'
\niki karakter olarak göründüğünü ima eden bir bilgidir: ntek bir yeni satır karakteri değil, onu takip eden abackslash . Bu nedenle, ters eğik çizgiyi değişmez yapmak için iki ters eğik çizgi ve sonran
Taşınabilir sedcevabınızı zaten aldığınızdan sed, yeni satırları bir şekilde manipüle etmeniz gerekirse , bunun nadiren en iyi araç olduğunu söyleyeceğim. Perl, neredeyse * kadar taşınabilir sed, çoğu * nix sistemde varsayılan olarak kurulur ve bununla kolayca başa çıkabilir:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
Çok taşınabilir başka bir seçenek awk:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
Solaris'te / usr / xpg4 / bin içindeki standart awk komutunu kullanmayı unutmayın, içinde / bin olanı tarihseldir ve yeni komut dosyaları için kullanılmamalıdır.
awkBenzer taşınabilirlik sorunları olduğunu söyleyebilirim (benim awkdüz yaşlı mı awk, nawkyoksa gawk?). Aslında, Solaris kutularımdaki sürüm eksik gsub(). Buradaki oyum Perl içindir ( perl -nlawe '...'otomatik davranışına yaklaşır awk).
awkTaşınabilirliği için, awkPOSIX uyumlu bir sürümüyle sopa ve sadece bu özellikleri kullanın ve iyi olmalısın. Solaris'te bir tane bulacaksınız /usr/xpg4/bin/awk.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'?
gsub()hemen her yerde işe yaramalı. Hatta meşgul kutusu bir vardır awk.
Eğer Holdspace olduğunu da yapabilirsiniz boşaltın:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... ama uxnut'un cevabı zaten hem daha hızlı hem de daha basit, bu yüzden istediğin gibi alabilirsin.
Başka bir yabancı olasılık:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Ama bütün standart C tarzı çevirir o ^, dikkat \gibi - ters eğik çizgi kaçar \backspace ve \return ve \00octals ve whathaveyou.
İle gnu sedaşağıdakiler de çalışır:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Sed içinde bir çözüme ihtiyacınız var ve bu zaten aşağıda verilmiştir. Ancak IMHO’nun daha kolay ve daha hızlı olması için bir olasılık daha eklemek istedim.
tr -d "\n"