Bagaimana cara membagi ekspresi sed lama menjadi beberapa baris?


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

Saya ingin membagi perintah ini menjadi beberapa baris - fx sesuatu seperti ini:

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

Menggunakan \atau memisahkan string tidak berhasil.



Itu sebabnya Perl memiliki /xmodifier untuk substitusi.
choroba

1
@Networker: ya, terima kasih, saya menambahkan jawaban saya di sana juga
Raffael

Jawaban:


8

Anda dapat menyimpan string panjang ke bash variabel, lalu gunakan dalam sedperintah:

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

Jika Anda bisa menggunakan perl, Anda bisa memecah pola panjang dengan xpengubah:

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

1
Mengapa Anda menggunakan banyak kutipan? sed "s/$string/$replace/" file.txtbaik-baik saja.
Scott

1
Juga, tentu saja, Anda perlu menghapus spasi setelahnya replace=.
Scott

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

Memisahkan pada beberapa baris dengan backslash tidak berfungsi jika baris baru tidak diindentasi.

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

Diuji pada Cygwin dengan GNU sed 4.2.2


Apa versi sed Anda? Saya mengujinya GNU sed version 4.2.1dan tidak berhasil.
cuonglm

2
Sepertinya ada garis miring terbalik yang hilang pada akhir baris pertama, setelah tebasan?
Volker Siegel

6

Aspek lain:

Seberapa terpelihara [long]barang - barang di atas?

Semakin pendek dan semakin berbeda Anda dapat mempertahankan klausa, semakin mudah untuk mengubah dan meningkatkan seiring berjalannya waktu dan (sed-eksternal) fakta berubah di sekitar fungsi yang mereka berikan.

misalnya

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] /' 

... mungkin sesuatu untuk diperjuangkan dan disukai.


4

Anda juga dapat memecahnya dengan cara ini:

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

Atau mungkin seperti:

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

Atau dengan heredoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.