Uzun sed ifadesini birden çok satıra nasıl bölerim?


15
sed 's/[long1][long2]/[long3][long4]/' file.txt

Bu komutu birden çok satıra bölmek istiyorum - fx böyle bir şey:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

\Dizeleri kullanmak veya ayırmak işe yaramadı.



Bu yüzden Perl'in /xyerine geçen bir değiştirici var.
choroba

1
@Networker: evet, teşekkürler, cevabımı da buraya ekledim
Raffael

Yanıtlar:


8

Uzun dizeyi bash değişkenlerine kaydedebilir, ardından sedkomutta kullanabilirsiniz :

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

Kullanabiliyorsanız perl, xdeğiştiriciyle uzun kalıbı kırabilirsiniz :

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file

1
Neden bu kadar fazla alıntı kullanıyorsunuz? sed "s/$string/$replace/" file.txtiyi.
Scott

1
Ayrıca, elbette, sonraki alanı silmeniz gerekir replace=.
Scott

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

Yeni çizgiler girintili değilse, ters eğik çizgiyle birkaç satıra bölmek işe yarar.

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

GNU sed 4.2.2 ile Cygwin üzerinde test edildi


Sed sürümünüz nedir? Test ediyorum GNU sed version 4.2.1ve işe yaramıyor.
cuonglm

2
Görünüşe göre ilk satırın sonunda bir ters eğik çizgi var, eğik çizgi mi?
Volker Siegel

7

Başka bir yön:

[long]Yukarıdaki öğeler ne kadar korunabilir ?

Maddeleri ne kadar kısa ve belirgin tutabilirsiniz, zaman geçtikçe değişmeleri ve gelişmeleri o kadar kolay olur ve sağladıkları işlevin etrafında (sed-external) gerçekler değişir.

Örneğin

sed \
-e 's / [minimal-s1] / [minimal-r1] /' \
-e 's / [minimal-s2] / [minimal-r2] /' \
-e 's / [minimal-s3] / [minimal-r3] /' \
-e 's / [minimal-s4] / [minimal-r4] /' 

... uğraşmak ve tercih etmek için bir şey olabilir.


4

Bunu şu şekilde de parçalayabilirsiniz:

sed '/[long1][long2]/
    s//[long3][long4]/'

Veya belki gibi:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

Veya bir yorumlu metinle:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
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.