Làm thế nào để chia biểu thức sed dài thành nhiều dòng?


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

Tôi muốn chia lệnh này thành nhiều dòng - fx đại loại như thế này:

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

Sử dụng \hoặc tách chuỗi không hoạt động.



Đó là lý do tại sao Perl có công cụ /xsửa đổi để thay thế.
choroba

1
@Networker: vâng, cảm ơn, tôi cũng đã thêm câu trả lời của mình ở đó
Raffael

Câu trả lời:


8

Bạn có thể lưu chuỗi dài vào các biến bash, sau đó sử dụng trong sedlệnh:

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

Nếu bạn có thể sử dụng perl, bạn có thể phá vỡ mô hình dài bằng công cụ xsửa đổi:

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

1
Tại sao bạn sử dụng nhiều trích dẫn? sed "s/$string/$replace/" file.txtỔn.
Scott

1
Ngoài ra, tất nhiên, bạn cần xóa không gian sau replace=.
Scott

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

Tách trên một số dòng với dấu gạch chéo ngược sẽ hoạt động nếu các dòng mới không được thụt lề.

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

Đã thử nghiệm trên Cygwin với GNU sed 4.2.2


Phiên bản sed của bạn là gì? Tôi kiểm tra GNU sed version 4.2.1và nó không hoạt động.
cuonglm

2
Hình như có một dấu gạch chéo ngược bị thiếu ở cuối dòng đầu tiên, xóa dấu gạch chéo?
Volker Siegel

6

Một khía cạnh khác:

Làm thế nào duy trì được các [long]mặt hàng trên?

Các mệnh đề càng ngắn và khác biệt, bạn càng dễ dàng thay đổi và nâng cao khi thời gian trôi qua và các sự kiện (bên ngoài) thay đổi xung quanh chức năng mà chúng cung cấp.

ví dụ

quyến rũ
-e 's / [Minimal-s1] / [Minimal-r1] /' \
-e 's / [Minimal-s2] / [Minimal-r2] /' \
-e 's / [Minimal-s3] / [Minimal-r3] /' \
-e 's / [Minimal-s4] / [Minimal-r4] /' 

... Có thể là một cái gì đó để phấn đấu và thích.


4

Bạn cũng có thể phá vỡ nó theo cách này:

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

Hoặc có thể như:

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

Hoặc với một di sản:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.