Thực hiện một lệnh trong 'sed'


9

Tôi có một danh sách các địa chỉ bộ nhớ ngẫu nhiên được lưu trong một tệp văn bản và tôi cần loại bỏ sedchúng, giải mã chúng và lưu chúng trở lại tệp của tôi. Tuy nhiên, thao tác giải mã tôi đang cố thực hiện được xử lý trong chương trình C ++ mà tôi đã tạo cách đây một thời gian. Vấn đề tôi gặp phải bây giờ là thực thi C ++ trong sedlệnh; đó là tôi muốn tham chiếu lại phần cần giải mã và sử dụng nó làm đối số trong chương trình C ++ của tôi. Tôi đã viết lệnh sau:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

trước khi tôi có cơ hội đọc một câu trả lời trong bài viết này nói rằng sedKHÔNG thực thi các lệnh. Có đúng là sedkhông cho phép thực hiện các lệnh? Nếu vậy, giả sử lệnh tôi đã viết là một sedchuỗi hợp lệ , tôi sẽ viết nó perlnhư thế nào?


liên kết được thêm vào. xấu của tôi :)
Fadi Hanna AL-Kass

Câu trả lời:


8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: like sed: xử lý một dòng đầu vào tại một thời điểm $_, đánh giá xpression perl [e] được truyền -echo mỗi dòng và [p] rint sửa đổi $_cho mỗi dòng.
  • s|X|Y|gei: Thay thế Ycho Xtrong $_([g] lobally, trường hợp [i] nsensitively, và điều trị Ynhư một perl [e] xpression thay vì một chuỗi cơ bản).
  • (?<=0x): nhìn phía sau cho 0x.
  • [0-9a-f]{1,8}: một đến 8 chữ số hex, càng nhiều càng tốt
  • `./convAddrs $&`: thay thế bằng đầu ra của dòng lệnh shell đó, nơi $&được thay thế bằng phần khớp.

Tôi đang gặp phải lỗi sau khi thực hiện lệnh của mình: Không có khoảng trắng giữa mẫu và từ sau bị phản đối ở dòng -e 1. Bộ sửa đổi chính quy "/ a" và "/ d" loại trừ lẫn nhau ở -e dòng 1, ở cuối của bộ sửa đổi Regapi "/ a" và "/ d" loại trừ lẫn nhau ở -e dòng 1, ở cuối dòng Không thể tìm thấy bộ kết thúc chuỗi "` "ở bất cứ đâu trước EOF tại -e dòng 1.
Fadi Hanna AL-Kass

1
Tất nhiên, xin lỗi, tôi không cần phải thay đổi dải phân cách vì chúng tôi không thể sử dụng /ở đây vì nó được sử dụng bên trong bộ phận thay thế. Đã sửa.
Stéphane Chazelas

Chết tiệt, và tôi mặc dù tôi khá giỏi về Perl one liners, +1!
terdon

2

Nó có thể đúng hoặc không đúng khi sedkhông thể thực thi các lệnh. Điều đó không đúng với GNU sed:

sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e  's/\n.//gp;g;s/^/#/e' <"$1"

Tôi không rõ chính xác những gì khác trong <$1đầu vào của bạn , và vì vậy tôi rất cẩn thận để #nhận xét bất cứ điều gì không có command \2trong không gian mẫu. Khi bạn sử dụng ecờ xecute của GNU trên một s///ubstlation, nó sẽ chuyển toàn bộ không gian mẫu kết quả thành $SHELL -cđối số thứ hai của nó, và sau đó thay thế tất cả không gian mẫu bằng bất cứ thứ gì được ghi vào $SHELLthiết bị xuất chuẩn đó. Vì vậy, tôi ở trên tôi in bất cứ kết quả nào của bạn trước, và sau đó là kết quả của việc truyền dòng lệnh vào trình bao.

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.