Xóa cho đến khi xuất hiện lần đầu tiên của đại tràng bằng sed


16

Lệnh sed của tôi là,

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

Nó phải trở lại,

bcde:cdeaf

(tức là) tất cả các ký tự trước dấu hai chấm đầu tiên trong dòng và dấu hai chấm phải được loại bỏ.

Nhưng điều này không loại bỏ bất cứ điều gì.

Sự nhầm lẫn của tôi phát sinh chủ yếu là do,

1) Parens cho khớp mẫu có cần phải được thoát trong sed regex-es không?

2) Trong cả hai trường hợp (với thoát / không thoát), nó không hoạt động. Tôi đã thử

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 

1
bạn muốn sed 's/[^:]*://'. Và nhân tiện, bạn không dxóa dòng đầu vào, nhân tiện, bạn đang sửa đổi nó bằng s///lệnh ubstlation. Bạn phải thay thế bit không dấu hai chấm đầu tiên và dấu hai chấm theo sau nó không có gì cả.
mikeerv

giải quyết nó ... cảm ơn, anh bạn ... đây là một ví dụ tôi đã học để tìm hiểu mô hình regex phù hợp bên trong sed ... vì vậy, tôi đang tìm kiếm một câu trả lời sử dụng khớp nhóm / mẫu với parens ...

3
Hoặc, chỉ sử dụng bash: printf "%s\n" "${line#*:}"...
jasonwryan

1
@jasonwryan - điểm tốt, xem xét nguồn ví dụ. Đó chắc chắn là cách hiệu quả hơn để xử lý nó. Nhưng nếu đó là một while read linecái được $line, có lẽ sednên được ưu tiên.
mikeerv

Câu trả lời:


23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

Đầu tiên ^có nghĩa là bắt đầu của dòng. Đây [^:]chỉ là cách duy nhất tôi biết cách viết chứ không phải dấu hai chấm . Các *sau dấu hai chấm có nghĩa là bất kỳ số lượng những điều đúng đắn trước khi tôi (trong trường hợp này không-ruột kết). Cuối cùng, :chọn dấu hai chấm.

Nói cách khác, chọn đầu dòng, bất kỳ số lượng nào không phải là dấu hai chấm và dấu hai chấm đầu tiên.

//gnghĩa là xóa mọi trường hợp phù hợp.


3
bạn không cần phải ^neo trận đấu của mình, ngoại trừ vì bạn cũng thêm một glá cờ thùy. chỉ có thể có một lần xuất hiện đầu tiên của một mẫu và do đó, gcờ thùy không loại bỏ tất cả [^:]*:các mẫu khỏi một dòng, giống như nếu bạn không ^neo nó. thay vì làm phức tạp regex bằng hai cờ không cần thiết chỉ làm mất cân bằng nhau, bạn có thể bỏ chúng đi, đó là những gì phiên bản chỉnh sửa của câu trả lời này đã thể hiện trước khi bạn quay lại. tại sao bạn lại khăng khăng phổ biến thông tin xấu mà tôi không biết, nhưng nó làm cho nó trở thành một câu trả lời tồi.
mikeerv

@mikeerv, như tôi đã nói rồi, cảm ơn vì đã chỉ ra điều này. Tôi chân thành đánh giá cao bạn giúp tôi cải thiện sedkỹ năng của tôi . Tôi mới đến sedvà chưa thoải mái đi lạc từ cú pháp rất hạn chế mà tôi đã chọn cho đến nay. Điều đó sed(heh), tôi nghĩ rằng câu trả lời của tôi giải quyết vấn đề của OP mặc dù đó không phải là câu trả lời tối ưu (tức là của bạn). Đây là Stack Exchange, không phải Wikipedia, vì vậy hãy sửa cho tôi nếu tôi sai nhưng nếu bạn biết câu trả lời tốt hơn, bạn nên đăng nó để mọi người có thể thấy nhiều cách tiếp cận khác nhau và so sánh chúng. Xin đừng biến câu trả lời của tôi thành câu trả lời của bạn bằng chức năng chỉnh sửa .
dùng1717828

4
đó không phải là câu trả lời của tôi đó là câu trả lời của bạn đó là tất cả. và nó là tốt . nó không còn nữa
mikeerv

4

Để hoạt động với các cột có cut:

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

cùng làm

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

Và phiên bản khác với sed(nhanh hơn cho dữ liệu lớn):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

Và khá kỳ lạ ở bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

hoặc là

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

hoặc là

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

Bạn cũng có thể thêm cách thích hợp để làm điều đó với sed, đó làsed 's/[^:]*://'
don_crissti

@don_crissti Phiên bản được ghi chú trong câu trả lời ở trên. Ngoài ra, do sử dụng regrec, nó chậm hơn vì phải biên dịch biểu thức trong mỗi dòng.
Costas

Không, không phải vậy. Câu trả lời ở trên hút thời gian lớn và xứng đáng nhận được rất nhiều lượt tải xuống - đặc biệt nếu bạn đọc các bản sửa đổi và các bình luận ở đó.
don_crissti
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.