\ N sed'deki portatif satırındaki newline ile değiştir


23

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 ?


Çok farklı şeyleri var, hangi kısmını bilmek istiyorsun?
cuonglm

@Gnouc bence şimdi açık.
Avinash Raj,

1
Bu soruya bir göz attın mı?
groxxda

2
Ya foo\\nbarda gibi girişlerde ne olmak istiyorsun foo\\\nbar?
Gilles 'SO- kötü olmayı bırak'

basit, bir sonraki satırda foo \ bar olacaktır.
Avinash Raj

Yanıtlar:


30
sed 's/\\n/\
/g'

Yedek dizgede dönüşe çarpmadan hemen önce ters eğik çizgiye dikkat edin.


bu her çeşit sed için işe yarıyor mu?
Avinash Raj,

Olması gerektiğine inanıyorum; Sadece Linux'ta gnu sürümünü kullanarak test ettim.
unxnut

11
@AvinashRaj. Bu POSIX ve 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.
Stéphane Chazelas

Yana \\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'

Bu durumda, \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
23

9

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).
arielCo

2
@arielCo: 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.
Scrutinizer


@arielCo aslında, awk perl'den daha taşınabilirdir . Benim kullanmadığım ikinci awk yaklaşımım gsub()hemen her yerde işe yaramalı. Hatta meşgul kutusu bir vardır awk.
terdon

1
gsub () POSIX'dir (gsub, SVR3.1'e eklenmiştir, POSIX awk, SVR4'ü temel almaktadır; birkaç eklemeyle gawk kılavuzuna bakınız), gensub () GNU uzantısıdır. Solaris'te hala orijinal bink / bin / awk olarak bulundu, gsub () desteğini desteklemedi, ancak çok karakterli bir FS'yi de desteklemedi.
Stéphane Chazelas

1

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.


0

İle gnu sedaşağıdakiler de çalışır:

gsed -n -e 'H;${x;s/\\n/\n/g;p;}'

-2

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"

1
bu ne yapar? girilen tüm yeni satırları sil?
mikeserv

Evet, aynen öyle yapar
jpmuc

5
ama neden? Bunun soru ile ne alakası var?
mikeserv 6'14

1
Bu yalnızca "\ n" sorusunu "\ n" dizesinin gerçek satırlar ile nasıl değiştirileceğini sorduğunda kaldırır.
spuder
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.