tôi không thể tìm cách kể sed dot match new line:cách kể sed "dot trận đấu dòng mới"
echo -e "one\ntwo\nthree" | sed 's/one.*two/one/m'
Tôi hy vọng sẽ nhận được:
một
ba
thay vào đó tôi nhận được bản gốc:
một
hai
ba
tôi không thể tìm cách kể sed dot match new line:cách kể sed "dot trận đấu dòng mới"
echo -e "one\ntwo\nthree" | sed 's/one.*two/one/m'
Tôi hy vọng sẽ nhận được:
một
ba
thay vào đó tôi nhận được bản gốc:
một
hai
ba
sed
là công cụ dựa trên dòng. Tôi không nghĩ đây là một lựa chọn.
Bạn có thể sử dụng h/H
(giữ), g/G
(nhận).
$ echo -e 'one\ntwo\nthree' | sed -n '1h;1!H;${g;s/one.*two/one/p}'
one
three
Có lẽ bạn nên thử vim
:%s/one\_.*two/one/g
Bạn có thể sử dụng python theo cách này:
$ echo -e "one\ntwo\nthree" | python -c 'import re, sys; s=sys.stdin.read(); s=re.sub("(?s)one.*two", "one", s); print s,'
one
three
$
này đọc đầu vào tiêu chuẩn toàn bộ python của (sys.stdin.read()
), sau đó thay thế "một" cho "một. * hai" với dot matches all setting enabled (sử dụng (?s)
khi bắt đầu cụm từ thông dụng) và sau đó in chuỗi đã sửa đổi ling dấu phẩy trong in được sử dụng để ngăn chặn in từ thêm một dòng mới bổ sung).
Tuyệt vời, lời khuyên tuyệt vời, sẽ giúp tôi tránh khỏi những rắc rối trong tương lai. Tôi bỏ lỡ các mẫu đa phương tiện dễ dàng, mà tôi đã sử dụng trong RegexBuddy trên Windows, và sau đó tương tự như mô-đun dễ dàng trong Python mà tôi sẽ tìm kiếm một số mã tổng quát hơn trên ActiveState và làm cho nó có sẵn như là lệnh hệ thống. Chúc mừng – theta
Điều này có thể làm việc cho bạn:
<<<$'one\ntwo\nthree' sed '/two/d'
hoặc
<<<$'one\ntwo\nthree' sed '2d'
hoặc
<<<$'one\ntwo\nthree' sed 'n;d'
hoặc
<<<$'one\ntwo\nthree' sed 'N;N;s/two.//'
Sed
không khớp với tất cả các ký tự (bao gồm cả \n
) sử dụng dấu chấm .
nhưng thường nó đã bị tước \n
tắt, như một phần của chu kỳ, vì vậy nó không còn xuất hiện trong không gian mẫu.
Chỉ một số lệnh nhất định (N
, H
và G
) bảo toàn dòng mới trong không gian mẫu/giữ.
N
nối thêm dòng mới vào không gian mẫu và sau đó nối tiếp dòng tiếp theo.H
thực hiện giống hệt ngoại trừ việc nó hoạt động trên không gian lưu giữ.G
nối thêm dòng mới vào không gian mẫu và sau đó nối thêm bất kỳ thứ gì trong vùng lưu giữ.Không gian giữ là trống cho đến khi bạn đặt một cái gì đó trong nó như vậy:
sed G file
sẽ chèn một dòng trống sau mỗi dòng.
sed 'G;G' file
sẽ chèn 2 dòng trống vv vv
Làm thế nào về hai cuộc gọi sed:
(thoát khỏi 'hai' đầu tiên, sau đó thoát khỏi dòng trống)
$ echo -e 'one\ntwo\nthree' | sed 's/two//' | sed '/^$/d'
one
three
Thực ra, tôi thích Perl cho một lớp lót trên Python:
$ echo -e 'one\ntwo\nthree' | perl -pe 's/two\n//'
one
three
Thần ks cho tip, nhưng tôi không cảm thấy thoải mái trong 'vim' (tôi là người dùng Linux mới) AFAIK nhà điều hành m/M được sử dụng để nói' sed' để chuyển sang chế độ multiline – theta
Tôi chỉ thấy giải pháp chỉnh sửa của bạn. Có vẻ khó hiểu nhưng đó là câu trả lời đúng. Cảm ơn – theta
@zetah 'Giữ' mọi thứ thành' giữ không gian', sau đó 'get' nó và thực hiện thay thế. – kev