Vì vậy, nói chung, tôi có xu hướng tìm cách sed
xử lý văn bản - đặc biệt là đối với các tệp lớn - và thường tránh thực hiện các loại điều đó trong chính trình bao.
Tôi nghĩ, mặc dù, điều đó có thể thay đổi. Tôi đã chọc vào man ksh
và tôi nhận thấy điều này:
<#pattern Seeks forward to the beginning of the
next line containing pattern.
<##pattern The same as <# except that the por‐
tion of the file that is skipped is
copied to standard output.
Nghi ngờ về tính hữu dụng trong thế giới thực, tôi quyết định dùng thử. Tôi đã làm:
seq -s'foo bar
' 1000000 >file
... cho một triệu dòng dữ liệu trông giống như:
1foo bar
...
999999foo bar
1000000
... và đọ sức với nó sed
như:
p='^[^0-8]99999.*bar'
for c in "sed '/$p/q'" "ksh -c ':<##@(~(E)$p)'"
do </tmp/file eval "time ( $c )"
done | wc -l
Vì vậy, cả hai lệnh phải nhận được tối đa 999999foo và việc thực hiện khớp mẫu của chúng phải đánh giá ít nhất là bắt đầu và kết thúc của mỗi dòng để làm như vậy. Họ cũng phải xác minh char đầu tiên chống lại một mô hình phủ định. Đây là một điều đơn giản, nhưng ... Kết quả không như tôi mong đợi:
( sed '/^[^0-8]99999.*bar/q' ) \
0.40s user 0.01s system 99% cpu 0.419 total
( ksh -c ':<##@(~(E)^[^0-8]99999.*bar)' ) \
0.02s user 0.01s system 91% cpu 0.033 total
1999997
ksh
sử dụng ERE tại đây và sed
BRE. Tôi đã làm điều tương tự với ksh
và một mẫu vỏ trước đây nhưng kết quả không khác nhau.
Dù sao, đó là một sự khác biệt khá đáng kể - ksh
vượt trội hơn sed
10 lần. Tôi đã đọc trước đó rằng David Korn đã viết io lib của riêng mình và thực hiện nó trong đó ksh
- có thể điều này có liên quan? - nhưng tôi không biết gì về nó Làm thế nào là vỏ làm điều này rất tốt?
Điều tuyệt vời hơn nữa đối với tôi là nó ksh
thực sự để lại sự bù đắp ngay khi bạn hỏi nó. Để có được (gần như) giống với (GNU) sed
bạn phải sử dụng -u
- rất chậm .
Đây là một bài kiểm tra grep
v.ksh
1000000 #grep + head
( grep -qm1 '^[^0-8]99999.*bar'; head -n1; ) \
0.02s user 0.00s system 90% cpu 0.026 total
999999foo bar #ksh + head
( ksh -c ':<#@(~(E)^[^0-8]99999.*bar)'; head -n1; ) \
0.02s user 0.00s system 73% cpu 0.023 total
ksh
nhịp đập grep
ở đây - nhưng không phải lúc nào cũng vậy - chúng bị trói khá nhiều. Tuy nhiên, điều đó khá xuất sắc và ksh
cung cấp head
đầu vào - bắt đầu trước khi trận đấu diễn ra.
Nó chỉ có vẻ quá tốt là đúng, tôi đoán. Những lệnh này làm khác nhau dưới mui xe là gì?
Ồ, và dường như thậm chí không có một subshell nào ở đây:
ksh -c 'printf %.5s "${<file;}"'
pattern
một biểu thức chính quy hoặc một mẫu vỏ đơn giản hơn?