Saya punya file seperti di bawah ini:
line1
line2
line3
Dan saya ingin mendapatkan:
prefixline1
prefixline2
prefixline3
Saya bisa menulis skrip Ruby, tetapi lebih baik jika saya tidak perlu.
prefix
akan mengandung /
. Itu adalah jalan, /opt/workdir/
misalnya.
linux
scripting
text-processing
pierrotlefou
sumber
sumber
sed
untuk tugas-tugas ringan seperti ini. Jika "awalan" diketahui, sangat mudah untuk memilih karakter bukan dari "awalan".sed
pipa, misalnyafoo | sed -e 's/^/x /' | bar
.sed -e '2,$s/^/prefix/'
./
like\/
(dalam string yang dikutip tunggal) atau\\/
(dalam string yang dikutip ganda)sed -e 's/$/postfix/' file
jika Anda ingin menambahkan string ke akhir setiap baris.Dengan Perl (pengganti di tempat):
sumber
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
laporanawk: out of memory in readrec 1 source line number 1
, tetapi solusi dengansed
berhasil selesai.Anda dapat menggunakan Vim dalam mode Ex:
%
pilih semua bariss
menggantikanx
Simpan dan tutupsumber
:%s/^/prefix/
, karena strategi ini akhirnya berguna dalam banyak situasiJika awalan Anda sedikit rumit, masukkan saja dalam variabel:
Kemudian, Anda meneruskan variabel itu dan membiarkan awk menanganinya:
sumber
Jika Anda memiliki Perl:
sumber
Menggunakan shell:
sumber
Berikut ini adalah solusi oneliner yang dapat dibaca dengan baik menggunakan
ts
perintah dari moreutilsDan bagaimana itu diturunkan langkah demi langkah:
sumber
Meskipun saya tidak berpikir pierr memiliki masalah ini, saya membutuhkan solusi yang tidak akan menunda output dari "ekor" file, karena saya ingin memonitor beberapa log peringatan secara bersamaan, mengawali setiap baris dengan nama masing-masing log .
Sayangnya, sed, cut, dll. Memperkenalkan terlalu banyak buffering dan membuat saya tidak bisa melihat baris terbaru. Saran Steven Penny untuk menggunakan
-s
opsinl
menarik, dan pengujian membuktikan bahwa itu tidak memperkenalkan buffer yang tidak diinginkan yang membuat saya khawatir.Namun, ada beberapa masalah dengan penggunaan
nl
, terkait dengan keinginan untuk menghapus nomor baris yang tidak diinginkan (bahkan jika Anda tidak peduli dengan estetika itu, mungkin ada kasus di mana menggunakan kolom tambahan tidak diinginkan). Pertama, menggunakan "potong" untuk menghapus angka-angka yang memperkenalkan kembali masalah buffering, sehingga merusak solusi. Kedua, menggunakan "-w1" tidak membantu, karena ini TIDAK membatasi jumlah baris menjadi satu kolom - itu hanya menjadi lebih luas karena lebih banyak digit diperlukan.Tidak cantik jika Anda ingin mengambil ini di tempat lain, tetapi karena itulah yang sebenarnya tidak perlu saya lakukan (semuanya sudah ditulis untuk mencatat file, saya hanya ingin menonton beberapa sekaligus dalam waktu nyata), yang terbaik cara untuk kehilangan nomor baris dan hanya awalan saya adalah memulai
-s
string dengan carriage return (CR atau ^ M atau Ctrl-M). Jadi misalnya:sumber
-u
opsi sed untuk menghindari buffering.Menggunakan ed:
Ini menggantikan, untuk setiap baris (
,
), awal baris (^
) denganprefix
.wq
menyimpan dan keluar.Jika string pengganti berisi garis miring, kita dapat menggunakan pembatas yang berbeda untuk
s
:Saya telah mengutip pembatas di sini-doc
EOE
("ujung ed") untuk mencegah ekspansi parameter. Dalam contoh ini, ini akan bekerja tanpa tanda kutip juga, tetapi praktik yang baik untuk mencegah kejutan jika Anda pernah memiliki$
dalam skrip ed Anda.sumber
Menggunakan & (seluruh bagian dari input yang cocok dengan pola ”):
ATAU menggunakan referensi balik:
sumber
Anda juga dapat mencapai ini menggunakan teknik backreference
Anda juga bisa menggunakannya dengan awk seperti ini
sumber
Berikut ini adalah contoh terbungkus menggunakan
sed
pendekatan dari jawaban ini :prefix_lines
sumber
PREFIX
berisi karakter khusus untuk sed seperti garis miring.prefix_lines \*
Untuk orang-orang di sistem BSD / OSX ada utilitas bernama
lam
, kependekan dari laminasi.lam -s prefix file
akan melakukan apa yang Anda inginkan. Saya menggunakannya di jalur pipa, misalnya:find -type f -exec lam -s "{}: " "{}" \; | fzf
... yang akan menemukan semua file, terutama pada masing-masing, memberikan setiap file awalan dari nama file sendiri. (Dan pompa output ke fzf untuk pencarian.)
sumber