Saya menulis skrip shell untuk Linux tertanam dalam kotak industri kecil. Saya memiliki variabel yang berisi teks pid: 1234
dan saya ingin menghapus karakter X pertama dari baris, jadi hanya 1.234 yang tetap. Saya memiliki lebih banyak variabel yang perlu saya "bersihkan", jadi saya perlu memotong karakter X pertama dan ${string:5}
tidak berfungsi karena beberapa alasan di sistem saya.
Satu-satunya yang tampaknya dimiliki kotak itu adalah sed
.
Saya mencoba membuat yang berikut ini berfungsi:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
Ada ide?
${string:5}
tidak berhasil maka Anda tidak menggunakan Bash atau shell lain yang mendukung sintaks itu. Shell dan versi apa yang Anda gunakan? Seperti apa penampilan shebang Anda? Dugaan saya adalah bahwa Anda menggunakansh
(sepertidash
) atau mungkinzsh
.Jawaban:
Ini akan melakukan pekerjaan juga:
sumber
awk -F": " '{print $2}'
. Tetap saja, bukan solusi favorit saya.Berikut ini harus bekerja:
Apakah kamu yakin
bash
shell menjalankan skrip Anda?Bahkan POSIX-compliant
akan lebih baik daripada menggunakan proses eksternal, meskipun ini mengharuskan Anda untuk membuat hard-kode 5 dalam bentuk pola panjang-tetap.
sumber
${var:5:2}
akan mulai1
dan kembali12
.Berikut adalah metode ringkas untuk memotong karakter X pertama menggunakan
cut(1)
. Contoh ini menghapus 4 karakter pertama dengan memotong substring dimulai dengan karakter ke-5.sumber
git log --pretty=oneline | cut -c 42- | head
cut -c ${LEN}-
. Kurung kurawal digunakan untuk menyatukan string dengan karakter variabel yang valid, untuk membedakan mana variabel dan apa yang tidak. Jika Anda ingin informasi lebih lanjut tentang ini, maka cari "gabungan string bash variabel" untuk sumber daya lebih lanjut tentang mengapa / bagaimana ini bekerja.Gunakan
-r
opsi ("gunakan ekspresi reguler yang diperluas dalam skrip")sed
untuk menggunakan{n}
sintaks:sumber
sed -r 's/.{5}$//'
untuk menghapus 5 karakter terakhir-r
(-E
di OS X, IIRC) jika Anda lolos dari kawat gigi (meskipun tidak tahu apakah itu berfungsi di OS X).-r
/-E
) bekerja di OS X.Potong dua karakter pertama dari string:
sumber
pipa melalui
awk '{print substr($0,42)}'
mana 42 adalah satu lebih dari jumlah karakter untuk dijatuhkan. Sebagai contoh:sumber
Kemungkinannya adalah, Anda juga akan memilikinya
cut
. Jika begitu:sumber
cut
adalah ia tidak menangani urutan spasi putih secara masuk akal, menggunakantr -s ' '
untuk "memeras" ruang membuatnya berperilaku lebih baik.Nah, ada solusi di sini dengan
sed
,awk
,cut
dan menggunakanbash
sintaks. Saya hanya ingin memasukkan varian POSIX yang lain:-c
memberi tahu ekor byte offset mana untuk memulai, menghitung dari akhir data input, namun jika nomor dimulai dengan+
tanda, itu dari awal input data ke akhir.sumber
Cara lain, menggunakan
cut
bukansed
.sumber
Saya menemukan jawabannya dalam sed murni yang disediakan oleh pertanyaan ini (memang, diposting setelah pertanyaan ini diposting). Ini melakukan persis seperti yang Anda minta, hanya dalam:
Titik masuk
sed '/./
) adalah apa pun yang ingin Anda cocokkan. Pertanyaan Anda adalah persis apa yang saya coba, kecuali dalam kasus saya, saya ingin mencocokkan baris tertentu dalam file dan kemudian menghapusnya. Dalam kasus saya itu adalah:The
-i
setelahsed
adalah untuk mengedit file di tempat (menghapus switch ini jika Anda ingin menguji ekspresi pencocokan Anda sebelum mengedit file).(Saya memposting ini karena saya ingin melakukan ini sepenuhnya dengan sed ketika pertanyaan ini diajukan dan tidak ada jawaban sebelumnya yang memecahkan masalah itu.)
sumber
Daripada menghapus n karakter dari awal, mungkin Anda bisa langsung mengekstrak digitnya. Seperti ...
Ini mungkin solusi yang lebih kuat, dan tampaknya lebih intuitif.
sumber