Tam perl düzenli ifade desteği (sed ile elde ettiğinizden çok daha güçlü) avantajı ile perl tek katmanlarını sed ile yaptığınız gibi kullanabilirsiniz . * Nix platformları arasında da çok az değişiklik vardır - perl genellikle perl'dir. Böylece, özel sisteminizin sed sürümünü nasıl istediğinizi yapmak konusunda endişelenmeyi bırakabilirsiniz.
Bu durumda,
perl -pe 's/(regex)/\n$1/'
-pe
perl'i sed'in normal çalışma moduna benzer şekilde bir "yürüt ve yazdır" döngüsüne yerleştirir.
'
diğer her şeyi tırnak içine alır, böylece kabuk karışmaz
()
normal ifadeyi çevreleyen bir gruplama operatörüdür. $1
ikame sağ tarafında bu parens içinde eşleşen her şeyi yazdırır.
Son olarak, \n
yeni bir satır.
Gruplama operatörü olarak parantez kullanıp kullanmadığınıza bakılmaksızın, eşleştirmeye çalıştığınız parantezlerden kaçmanız gerekir. Dolayısıyla, yukarıda listelediğiniz desenle eşleşen bir normal ifade,
\(\d\d\d\)\d\d\d-\d\d\d\d
\(
veya \)
değişmez bir paren ile \d
eşleşir ve bir rakamla eşleşir.
Daha iyi:
\(\d{3}\)\d{3}-\d{4}
Parantez içindeki sayıların ne yaptığını anlayabileceğinizi düşünüyorum.
Ayrıca, normal ifadeniz için / dışında ayırıcılar kullanabilirsiniz. Yani eğer eşleştirmeniz gerekiyorsa / kaçmanız gerekmeyecek. Aşağıdakilerden herhangi biri cevabımın başındaki normal ifadeye eşdeğer. Teorik olarak , standartların yerine herhangi bir karakteri koyabilirsiniz .
perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'
Birkaç son düşünce.
kullanarak -ne
yerine -pe
benzer atmasına karşın otomatik sonunda yazdırmaz. Kendi başınıza yazdırmak istiyorsanız kullanışlı olabilir. Örneğin, işte bir grep-benzeri ( m/foobar/
bir normal ifade eşleşmesi):
perl -ne 'if (m/foobar/) {print}'
Yeni satırlarla uğraşmayı zahmetli buluyorsanız ve bunun sizin için sihirli bir şekilde ele alınmasını istiyorsanız, ekleyin -l
. Yine de, yeni satırlarla çalışan OP için yararlı değil.
Bonus ipucu - pcre paketi yüklüyse, pcregrep
tam perl uyumlu regexes kullanan ile birlikte gelir .
sed '/regex/G'