sed: thay thế bất kỳ số lần xuất hiện của một mẫu nhất định


5

Cho đầu vào này:

 "hell -- 'this -- world --is'-- beautiful' --thanks-- we'-- are-- here" 

Tôi muốn thay thế mọi '-' ở giữa các dấu ngoặc đơn bằng 'XXX' bằng cách sử dụng sed. Nó sẽ cho đầu ra sau:

đầu ra: "hell - 'thế giới XXX này XX-Xis' - đẹp 'XX-Xthanks XXX chúng tôi' - đang ở đây"

Số lượng thay thế có thể không xác định (lên đến vô cùng).

Câu trả lời:


9

Chỉnh sửa:

Sử dụng yêu cầu mới của bạn:

sed 's/\o47[^\o47]*\o47/\n&\n/g;:a;s/\(\n\o47[^\n]*\)--/\1X-X-X/;ta;s/\n//g' input file

Chỉnh sửa 2:

Đối với một số phiên bản sedkhông thích dấu chấm phẩy:

sed -e 's/\o47[^\o47]*\o47/\n&\n/g' -e ':a' -e 's/\(\n\o47[^\n]*\)--/\1X-X-X/' -e 'ta' -e 's/\n//g' inputfile

Nếu bạn sedcũng không hỗ trợ mã thoát bát phân:

sed -e "s/'[^']*'/\n&\n/g" -e ':a' -e "s/\(\n'[^\n]*\)--/\1X-X-X/" -e 'ta' -e 's/\n//g' inputfile

Câu trả lời gốc:

Bạn thường nên sử dụng các trích dẫn đơn để bao quanh sedtập lệnh để bạn không phải thoát các ký tự có thể đặc biệt đối với trình bao. Mặc dù trong trường hợp này không cần thiết, đó là một thói quen tốt để phát triển.

sed 's/--/X-X-X/g' inputfile

hoặc là

var="hell --this -- world is --beaut--iful"
newvar=$(echo "$var" | sed 's/--/X-X-X/g')

Không có công cụ gsửa đổi, việc thay thế được thực hiện trong trận đấu đầu tiên trên mỗi dòng đầu vào. Khi gđược sử dụng, mỗi trận đấu trên mỗi dòng đầu vào được thay thế. Bạn cũng có thể thay thế cho các trận đấu cụ thể:

$ var="hell --this -- world is --beaut--iful"
$ echo "$var" | sed 's/--/X-X-X/2'
hell --this X-X-X world is --beaut--iful

xin lỗi vì đã đặt câu hỏi của tôi sai cách: đầu vào: "hell - 'this - world --is' - beautiful '- cảm ơn-- chúng tôi' - đang-- đây" đầu ra: "hell - 'này thế giới XX-Xis '- người đẹp' XX-Xthanks XXX chúng tôi '- đang ở đây "
shiva

@shiva: Xin vui lòng xem câu trả lời chỉnh sửa của tôi. Ngoài ra, vui lòng chỉnh sửa câu hỏi của bạn để hiển thị đầu vào này thay vì câu hỏi bạn đã đăng ban đầu.
Dennis Williamson

@shiva: Thông báo lỗi cụ thể bạn nhận được là gì? Bạn sedđang sử dụng phiên bản nào? Hệ điều hành là gì? Hãy thử phiên bản mới mà tôi đã thêm để phân tách các phần của tập lệnh bằng cách sử dụng -e.
Dennis Williamson

7

Bạn muốn sử dụng công tắc / g ở cuối để phân tích nhiều hơn một thay thế trên mỗi dòng.

sed s/--/X-X-X/g

5
$ echo "hell --this -- world is --beaut--iful" | sed s"/--/X-X-X/g"
hell X-X-Xthis X-X-X world is X-X-XbeautX-X-Xiful

Chìa khóa là công gtắc: Nó gây ra sedđể thay thế tất cả các lần xuất hiện.


Cảm ơn vì đã trả lời nhanh, xin lỗi vì đã đặt câu hỏi của tôi sai cách - đẹp '- cảm ơn-- chúng tôi' - đang-- ở đây "đầu ra:" địa ngục - 'thế giới XXX này XX-Xis' - đẹp 'XX-Xthanks XXX chúng tôi' - đang ở đây "Cảm ơn
shiva

Cảm ơn Dainel đã trả lời nhanh Xin lỗi vì đã đặt câu hỏi của tôi sai, tôi đã đăng lại câu hỏi của mình với tiêu đề gần như giống nhau Cảm ơn
shiva

cảm ơn Daniel sed 's / \ o47 [^ \ o47] * \ o47 / \ n & \ n / g ;: a; s / (\ n \ o47 [^ \ n] *) - / \ 1X-XX /; ta; s / \ n // g 'tập tin đầu vào nhưng "cái này cho biểu thức chính quy Lỗi: ????????????????"
Shiva

@shiva: Bạn trả lời sai. Tôi (Dennis) là người đã đăng câu trả lời dường như đang gây ra lỗi cho bạn. Tôi sẽ trả lời bình luận của bạn trong một bình luận kèm theo câu trả lời của tôi.
Dennis Williamson

0
echo "     -- hell     -- this ------   world       ---- test"  |\
sed -r 's/[ ]+[-]+[ ]+/ x-x-x /g'

Cung cấp:

 x-x-x hell x-x-x this x-x-x world x-x-x test

Chuỗi ký tự trong ngoặc được khớp với một hoặc nhiều lần lặp lại bằng ký hiệu cộng.

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.