Saya mengalami masalah saat mencoba menulis skrip Bash. Ketika grep
output, ia mengembalikan (biasanya) banyak baris. Saya ingin awalan dan sufiks sebuah string ke masing-masing jalur output ini.
Saya juga ingin untuk dicatat bahwa saya perpipaan ls
ke grep
, seperti:
ls | grep
bash
shell-script
grep
SpecialBomb
sumber
sumber
ls
- itu juju buruk. Juga, haruskah demikiangrep
? Dan bisakah Anda memberikan beberapa contoh output?Jawaban:
Dengan sed:
sumber
sed
menjadi superset darigrep
:ls | sed -n '/txt/s/.*/prefix&suffix/p'
atauls | sed -n 's/.*txt.*/prefix&suffix/p'
Dengan
sed
:Tetapi perhatikan, ini mengalami masalah dengan nama file dengan umpan baris, dan semua masalah penguraian
ls
yang umumnya merupakan ide yang buruk.Dengan perl
Catatan - perl
grep
dapat mengambil pola - sepertigrep
perintah, tetapi Anda juga dapat melakukan hal-hal seperti menerapkan tes file.Misalnya
Dalam
grep
iterator default$_
diatur ke nilai elemen saat ini, sehingga Anda dapat menerapkansed
/grep
style regex, atau melakukan berbagai tugas berdasarkan$_
.sumber
“
dan gunakan em.Dalam hal ini, GNU
find
memungkinkan Anda melakukan semua hal ini sekaligus, menghilangkan pipa dan kemungkinan penguraianls
:(
find
tentu saja bukan cara yang baik untuk memodifikasi output dari perintah lain!)Beberapa catatan:
-maxdepth 1
dan-name [^.]*
membuat pencocokan nama berfungsi sama dengan dataranls
(atauls .
). Anda dapat menggunakan gumpalan gaya-shell apa pun, tetapi perhatikan bahwa "*" akan cocok dengan yang pertama "." dalam nama † tidak sepertibash
, jadi[^.]*
berarti apa pun yang tidak memiliki arahan ".".*thing.*
alih - alih hanyathing
-name
/-regex
bukan keduanya (mis. -regex "[^.]. MYPATTERN. "-printf
mendukung banyak hal ,%n
adalah file atau nama direktori tanpa hiasanSebagai alternatif yang mungkin tanpa program eksternal yang diperlukan,
bash
memilikicompgen
yang, antara lain, memperluas gumpalan, setarals
dengan yang tanpa opsi:Ini menangani nama file dengan spasi putih, termasuk baris baru.
compgen -G "*"
harus memberikan output yang sama dengan yang biasals
(tetapi perhatikan bahwa ituls *
adalah hal yang sama sekali berbeda). Anda masih perlugrep
, dan ini mungkin atau mungkin tidak menyelesaikan masalah, tetapi perlu disebutkan.sumber
sed
danfind
solusi ditantang jika awalan / akhiran Anda menyertakan karakter kunci regex atau jika ingin meneruskan variabel lingkungan (bukan nilai langsung),xargs
+echo
mungkin lebih sesuai di sini.Dengan variabel lingkungan:
Dengan sebaris:
sumber