Anda bisa mendapatkan baris hanya dengan grep
rekursif, dengan atau tanpa nama file.
grep -r '^little boy writes' * # lists source filenames
grep -hr '^little boy writes' * # does not
Namun, ini melaporkan keseluruhan baris. Pencocokan pola Perl (-P
) dengan -o
mungkin dapat mendeteksi garis yang benar dan hanya mengembalikan bit yang Anda inginkan, tetapi polanya akan sangat buruk untuk dipahami dan dipelihara oleh kebanyakan orang, jadi mungkin perlu proses kedua -
grep -hr '^little boy writes' /tmp/temp_dir/subdir_[0-9][0-9][0-9]/file_[0-9][0-9][0-9].txt |
sed -E 's/[^0-9_]*([0-9_]+)/\1 /g'
atau jika Anda benar-benar ingin menghindari ruang tersebut pada akhirnya,
grep -hr '^little boy writes' /tmp/temp_dir/subdir_[0-9][0-9][0-9]/file_[0-9][0-9][0-9].txt |
's/^[^0-9_]*([0-9_]+)[^0-9_]*([0-9_]+$)/\1 \2/'
Tetapi jika Anda tahu persis di mana file-file itu cukup baik untuk melakukan globbing seperti itu, yang Anda perlukan hanyalah sed.
sed -En '/^little boy writes/{ s/^[^0-9_]*([0-9_]+)[^0-9_]*([0-9_]+$)/\1 \2/g; p; }' /tmp/temp_dir/subdir_[0-9][0-9][0-9]/file_[0-9][0-9][0-9].txt
Jika tidak, grep
dan/atau sed
mungkin menghabiskan banyak data yang sebenarnya bisa Anda hindari...dan mungkin struktur direktori Anda tidak begitu konsisten. Dalam hal ini, shopt
akan membantu.
shopt -s globstar # let's ** stand for variable depth of subdirectories
sed -En '/^little boy writes/{ s/^[^0-9_]*([0-9_]+)[^0-9_]*([0-9_]+$)/\1 \2/g; p; }' **/file_[0-9][0-9][0-9].txt
Ini seharusnya jauh lebih efisien (dan lebih cepat). Ini akan membiarkan OS memilih file yang cocok dan hanya menyerahkan file tersebut ke sed
untuk dipindai.
Ini juga hanya menggunakan satu contoh sed
, daripada memunculkan satu contoh untuk setiap file dengan find
atau memerlukan xargs
.
Semoga beruntung.
person
Paul Hodges
schedule
30.07.2020