GNU sed
, POSIX sed
ve BSD'nin sed
sayısız seçenekleriyle kafam karıştı . \n
Bu üç sed
türü kullanarak değişmezi newline karakteriyle nasıl değiştiririm ?
foo\\nbar
da gibi girişlerde ne olmak istiyorsun foo\\\nbar
?
GNU sed
, POSIX sed
ve BSD'nin sed
sayısız seçenekleriyle kafam karıştı . \n
Bu üç sed
türü kullanarak değişmezi newline karakteriyle nasıl değiştiririm ?
foo\\nbar
da 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.
sed
1979'da Unix v7'deki orijinal komutla çalıştı . İşe yaramayacak tek yer, sed
bazı çı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.
\\n
arama bölümü kullanılır, neden kullanmayın \n
yerini de? İlki, var olanı ima ediyor gibi görünüyor. yani. neden bu değil$ echo '1\n2'|sed 's/\\n/\n/g'
\n
iki karakter olarak göründüğünü ima eden bir bilgidir: n
tek 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 sed
cevabı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.
awk
Benzer taşınabilirlik sorunları olduğunu söyleyebilirim (benim awk
düz yaşlı mı awk
, nawk
yoksa gawk
?). Aslında, Solaris kutularımdaki sürüm eksik gsub()
. Buradaki oyum Perl içindir ( perl -nlawe '...'
otomatik davranışına yaklaşır awk
).
awk
Taşınabilirliği için, awk
POSIX 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 H
oldspace 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 \b
ackspace ve \r
eturn ve \00
octals ve whathaveyou.
İle gnu sed
aş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"