Làm cách nào để đọc sed từ đầu vào chuẩn? [bản sao]


91

tôi đang cố gắng

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'

và nhận được

unknown option to `s'

Tôi đang làm gì sai?

Biên tập:

Theo các ý kiến, mã thực sự là chính xác. Mã đầy đủ của tôi giống như sau

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'
# my comment

Và có vẻ như vì lý do nào đó mà nhận xét của tôi được đưa vào làm đầu vào cho sed. Rất lạ.


Bạn có muốn thay thế tệp của mình bằng 'withthis' thay cho tên thay thế không?
Teja

2
Không, đó không phải là những gì bạn đang cố gắng. Còn thiếu cái gì đó nữa.
Ignacio Vazquez-Abrams

6
Dự đoán tốt nhất của tôi là trong trường hợp thực của bạn, bạn có /trong replacemehoặc withthis. Hãy thử: 's#replaceme#withthis#g'.
cababunga

4
Một điều mà bạn đang làm sai là không cho chúng tôi thấy chính xác những gì bạn đang thực hiện. Mã bạn hiển thị là tốt; bạn có vấn đề với những gì bạn đang thực hiện; ergo, bạn không cho chúng tôi thấy những gì bạn đang thực hiện. Chúng tôi không thể gỡ lỗi những gì chúng tôi không thể nhìn thấy, hầu hết thời gian. Đôi khi, chúng ta sẽ gặp may và đoán đúng, nhưng chúng ta không cần phải đoán hoặc may mắn.
Jonathan Leffler

1
Sử dụng grep vô ích. Với sed, bạn có thể làm: sed '/ searchterm / s / mô hình / thay thế / g' myfile.csv
William Pursell

Câu trả lời:


120

sử dụng tùy chọn --expression

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'

+ SOaddict, Đây chỉ là xuất ra stdout, nó không thay đổi myfile.csv.
Josiah

1
Nếu bạn đang muốn cập nhật tệp tại chỗ, tôi nghĩ câu trả lời của tôi giải quyết được vấn đề đó một cách thỏa đáng.
Wes

Bất cứ thứ gì trông giống như vậy grep 'x' y | sed 'z'đều có thể được cấu trúc lại sed '/x/z' y. Xem thêm việc sử dụng vô ích grep.
ba

39

sử dụng "-e" để chỉ định biểu thức sed

cat input.txt | sed -e 's/foo/bar/g'

1
Tôi đã tự hỏi làm thế nào sử dụng "-e" để chỉ định biểu thức sed có thể nhận sed để đọc từ stdin? Sed theo mặc định có đọc từ stdin không?
Tim

1
Đúng. giống như hầu hết các công cụ un * x, sedđọc từ stdin nếu không có tệp đầu vào nào.
umläute

Cảm ơn. là -ecần thiết? Nó hoạt động mà không cần -e. Không biết mục đích sử dụng là -egì? Cảm ơn.
Tim

2
Tôi không chắc mình hiểu câu hỏi của OP. echo foo | sed 's/foo/bar/g'hoạt động mà không -e, bằng cách outputing bar. Vì vậy, tôi hẳn đã bỏ lỡ câu hỏi của anh ấy.
Tim

Không cần chỉ định -enếu bạn chỉ có một câu lệnh script duy nhất. Nếu bạn có hai, bạn có thể nói sed -e '/foo/!d' -e 's//bar/g'hoặc sed 's/foo!d;s//bar/g'(hoặc tương đương, bằng một dòng mới thay vì dấu chấm phẩy).
ba

6

Để thực hiện sedbắt từ stdin, thay vì từ tệp, bạn nên sử dụng -e.

Như thế này:

curl -k -u admin:admin https://$HOSTNAME:9070/api/tm/3.8/status/$HOSTNAME/statistics/traffic_ips/trafc_ip/ | sed -e 's/["{}]//g' |sed -e 's/[]]//g' |sed -e 's/[\[]//g' |awk  'BEGIN{FS=":"} {print $4}'

2

Nếu bạn đang cố gắng thực hiện cập nhật văn bản tại chỗ trong một tệp, điều này dễ lý giải hơn trong tâm trí tôi.

grep -Rl text_to_find directory_to_search 2>/dev/null | while read line; do  sed -i 's/text_to_find/replacement_text/g' $line; done


-16
  1. Mở tệp bằng vi myfile.csv
  2. nhấn Escape
  3. Kiểu :%s/replaceme/withthis/
  4. Nhập :wqvà nhấnEnter

Bây giờ bạn sẽ có mẫu mới trong tệp của mình.


11
OP muốn biết cách làm điều đó với sed, không phải với vim.
Noe Nieto

1
Noe đã nói gì. Ngoài ra, giải pháp vim của bạn kém hơn (các) giải pháp thay thế sed vì nó không (dễ dàng) có thể viết được.
weberc2
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.