sed tìm kiếm toàn bộ từ và thay thế


120

Làm cách nào để tìm kiếm và thay thế toàn bộ từ bằng sed?

Đang làm

sed -i 's/[oldtext]/[newtext]/g' <file> 

cũng sẽ thay thế một phần các trận đấu [oldtext]mà tôi không muốn nó làm.

Câu trả lời:


164

\ b trong biểu thức chính quy khớp với ranh giới từ (nghĩa là vị trí giữa ký tự từ đầu tiên và ký tự không phải từ):

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment


@OlegMazko Tôi cũng đã tìm kiếm phương pháp posix được chấp nhận để sử dụng trong vim và những gì phù hợp với tôi là s / \ <7 // g. Tôi đang cố xóa số 7 ở đầu một từ trong mã của mình. Liên kết này, cụ thể là giải pháp của JP, đã dẫn tôi đến câu trả lời: stackoverflow.com/questions/3864467/… (không thể lấy markdown để nhúng nó giống như của bạn vì lý do nào đó).
jimh

Cảm ơn bạn tôi đã đi điên cố gắng để làm một sự thay thế vào chữ "và" để \band\blưu ngày :)
MitchellK

144

Trên Mac OS X, cả hai cú pháp regex này đều không hoạt động bên trong sed để đối sánh toàn bộ các từ

  • \bmyWord\b
  • \<myWord\>

Nghe tôi bây giờ và tôi tin rằng sau đó, này cú pháp xấu xí là những gì bạn cần phải sử dụng:

  • /[[:<:]]myWord[[:>:]]/

Vì vậy, ví dụ, để thay thế bạc hà bằng bạc hà chỉ cho toàn bộ các từ:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

Nguồn: re_format man page


19
Chỉ cần cài đặt GNU sed(và mọi công cụ GNU khác) thông qua MacPorts hoặc Homebrew và đảm bảo nó xuất hiện trước tiên trong bạn PATH. Có thể làm cho một máy Mac khá khả dụng.
Jim Stewart,

9
@JimStewart cách tuyệt vời để phá vỡ một loạt các công cụ giả định 'khi sử dụng OS X, hãy làm như OS Xers.' Điều đó nói rằng, tôi chắc chắn có thể đề xuất brew install coreutils, tiền tố của tất cả các công cụ gnu.
ELLIOTTCABLE

16
brew install gnu-sedđể sử dụnggsed
k107

bia lõi là tuyệt vời. có bất kỳ gói pha chế nào khác cài đặt một loạt các phiên bản gnu của lệnh hay tôi cần cài đặt riêng phần còn lại?
ckot

2
Sử dụng perl luôn luôn là một giải pháp tốt hơn: perl -pe 's|\bone\b|two|g'. Hoạt động ổn định trong khi sed bị lỗi chỗ này chỗ kia.
Pavel Vlasov

13

Sử dụng \bcho ranh giới từ:

sed -i 's/\boldtext\b/newtext/g' <file>

3
Hãy cẩn thận với []: o,l-> [newtext],[newtext]. Ý của bạn rõ ràng là sed -i 's/\boldtext\b/newtext/g'
JJoao

7

Trong một máy của tôi, việc phân định từ bằng " \b" (không có dấu ngoặc kép) không hoạt động. Giải pháp là sử dụng " \<" để bắt đầu dấu phân cách và " \>" để kết thúc dấu phân cách.

Để giải thích bằng ví dụ của Joakim Lundberg :

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment

2

trong lệnh shell:

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

hoặc là:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

nhưng nếu bạn đang ở trong vim, bạn chỉ có thể sử dụng sau này:

:% s/\<old\>/new/g

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

OP tuyên bố rõ ràng "sử dụng sed"
ndemou.

Đây là một chia-thao tác-nối, không phải là một sự thay thế thuần túy; điều này thu gọn nhiều khoảng trắng thành một và loại bỏ mọi khoảng trắng ở đầu / cuối: ví dụ: echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Echo no bar embarassment$.
musiphil,
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.