2013-07-18 26 views
5

<>, ## veya || ile ayrılmış gruplar içeren bir metin gövdeye sahibim. blok üst üste, ancak bu gibi, birden çok çizgileri olabilir hiç:Birden fazla sınırlandırılmış bloğun değiştirilmesi

#A fully emphasized line# 
A line with #emphasis inside#. 
#Several lines of 
text 
With emphasis# 
no emphasis 
Line #with# multiple #emphasis#. 
Line <with some > |text of| #each type#. 

I [ve] ve] ardından son bir sınırlayıcı koymak ile sınırlayıcı her çift yerine çalışılıyor; Örneğin son satırı olmalıdır: Ben ilk bölümü yapacak bir sed komut dosyası oluşturdular

Line [with some ]> [text of]| [each type]#. 

:

sed -e ':left s/[#|<]/[/; t right; n; b left :right s/[#|>]/]/; t left;n; b right' 

Ama & (veya kullanmaya çalıştığınızda (..) + \ 1) bu şekilde geri karakteri koymak için:

sed -e ':left s/[#|<]/[/; t right; n; b left :right s/[#|>]/]&/; t left;n; b right' 

aşağıdaki alıyorum:

Burada neyin yanlış gittiğinden emin değilim - desen bloğu ile bir şekilde vidalanmış gibi görünüyor. Üç arama ile (eşleşme türünde kodlanmış bir tane) değiştirebilirdim, ama bu aşırı görünüyor.

cevap

4

Aşağıdaki komutu deneyin. Bu bellekteki dosyanın tamamını okur ve sınırlayıcı her çifti için küresel değiştirmelerin yapın:

sed -e ' 
    :a 
    $! { N; ba }; 
    s/#\([^#]*\)#/[\1]#/g; 
    s/<\([^>]*\)>/[\1]>/g; 
    s/|\([^|]*\)|/[\1]|/g 
' infile 

O verir:

[A fully emphasized line]# 
A line with [emphasis inside]#. 
[Several lines of 
text 
With emphasis]# 
no emphasis 
Line [with]# multiple [emphasis]#. 
Line [with some ]> [text of]| [each type]#. 
+1

Serin. Birleştirilmiş sürüm bununla da çalışır, böylece üç arama şu şekilde değiştirilebilir: 's/[# | <]\([^#|>] * \) \ ([# |>] \)/[\ 1] \ 2/g; ' –

+0

user2596375 - Üç sed ifadesi daha üstündür, çünkü deseniniz mutlaka eşleşenleri değil, herhangi bir sınırlayıcı çiftinin yerini alır. Örneğin #text>, # metin # değil olsa bile, [metin]> ile değiştirilir. – gbrener

İlgili konular