Bagaimana saya bisa menghapus karakter X pertama dari string menggunakan sed?

126

Saya menulis skrip shell untuk Linux tertanam dalam kotak industri kecil. Saya memiliki variabel yang berisi teks pid: 1234dan 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?

Kokesh
sumber
10
Jika ${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 menggunakan sh(seperti dash) atau mungkin zsh.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

0

Ini akan melakukan pekerjaan juga:

echo "$pid"|awk '{print $2}'
Arnaud F.
sumber
27
Pertanyaan ini adalah hit pertama untuk "lewati karakter N pertama dalam string". Anda tidak menjawab pertanyaan itu.
jww
Ini sepertinya tidak berhasil, dan jika berhasil, dapatkah Anda menjelaskan caranya
Alexander Mills
Itu bekerja pada sistem saya. Mungkin ada masalah dengan pemisah bidang Anda, cobalah awk -F": " '{print $2}'. Tetap saja, bukan solusi favorit saya.
mzuther
197

Berikut ini harus bekerja:

var="pid: 1234"
var=${var:5}

Apakah kamu yakin bash shell menjalankan skrip Anda?

Bahkan POSIX-compliant

var=${var#?????}

akan lebih baik daripada menggunakan proses eksternal, meskipun ini mengharuskan Anda untuk membuat hard-kode 5 dalam bentuk pola panjang-tetap.

chepner
sumber
1
Anda juga dapat menentukan panjang dengan parameter kedua: ${var:5:2}akan mulai 1dan kembali 12.
Max Candocia
107

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.

echo "$pid" | cut -c 5-
Randy the Dev
sumber
2
Ini adalah solusi paling sederhana!
Brandon
2
Secara teknis OP meminta sed, tapi saya merasa seperti ini adalah solusi terbaik untuk "Bagaimana saya bisa menghapus karakter X pertama dari string [di terminal / bash]" Ketika digunakan dalam kombinasi dengan git, itu bagus:git log --pretty=oneline | cut -c 42- | head
marksiemers
1
+1 Solusi sederhana dan bermanfaat .. Ketika saya memiliki URL sebagai http: // <example.com> dan untuk memotong protokol 'http: //' Saya harus mengatakan sebagai 8 karakter bukan 7. Saya tidak tahu , tapi begitulah cara kerjanya bagi saya.
Santosh Kumar Arjunan
1
Santosh Kumar Arjunan: itu karena contoh "echo" $ pid "| cut -c 4-" sebenarnya tidak memotong 4 karakter pertama tetapi mengekstraksi substring mulai dari karakter ke-4. Karena itu sebenarnya memotong 3 karakter pertama. Jadi, jika Anda ingin memotong 7 karakter pertama, Anda ingin mengekstraksi semuanya dari karakter ke-8 dan karenanya memang melakukan "cut -c 8-"
al-ash
1
@DeanHiller 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.
JustCarty
46

Gunakan -ropsi ("gunakan ekspresi reguler yang diperluas dalam skrip") seduntuk menggunakan {n}sintaks:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Mark Longair
sumber
1
bagaimana jadinya, jika saya ingin menghapus karakter X terakhir dari sebuah string?
Kokesh
5
@Kokesh: Anda dapat melakukannya sed -r 's/.{5}$//'untuk menghapus 5 karakter terakhir
Mark Longair
7
Anda dapat melakukannya tanpa -r( -Edi OS X, IIRC) jika Anda lolos dari kawat gigi (meskipun tidak tahu apakah itu berfungsi di OS X).
Dijeda sampai pemberitahuan lebih lanjut.
2
@ Dennis: Saya baru saja memeriksa - melarikan diri kawat gigi (dan meninggalkan -r/ -E) bekerja di OS X.
Gordon Davisson
15

Potong dua karakter pertama dari string:

$ string="1234567890"; echo "${string:2}"
34567890
dtp70
sumber
@ dtp70 Terima kasih banyak jawaban generik, itu berhasil hebat!
wolfram77
10

pipa melalui awk '{print substr($0,42)}'mana 42 adalah satu lebih dari jumlah karakter untuk dijatuhkan. Sebagai contoh:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$
Ben
sumber
8

Kemungkinannya adalah, Anda juga akan memilikinya cut. Jika begitu:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
Shawn Chin
sumber
1
Masalahnya cutadalah ia tidak menangani urutan spasi putih secara masuk akal, menggunakan tr -s ' 'untuk "memeras" ruang membuatnya berperilaku lebih baik.
Thor
1
Itu tidak dimaksudkan untuk menjadi alat semua menari semua bernyanyi; itu sederhana dan melakukan seperti yang dikatakan di kaleng dan tersedia secara luas. Seharusnya berfungsi dengan baik untuk persyaratan tersebut, dan tentu saja lebih kuat yang memangkas karakter tetap dari posisi tertentu.
Shawn Chin
5

Nah, ada solusi di sini dengan sed, awk, cutdan menggunakan bashsintaks. Saya hanya ingin memasukkan varian POSIX yang lain:

$ echo "pid: 1234" | tail -c +6
1234

-cmemberi 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.

Mecki
sumber
4

Cara lain, menggunakan cutbukan sed.

result=`echo $pid | cut -c 5-`
Evgeny
sumber
Dia ingin menghapus 4 karakter pertama. Ini mendapatkan 4 karakter pertama.
MM.
2

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:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

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:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

The -isetelahsed 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.)

kepala pohon
sumber
1

Daripada menghapus n karakter dari awal, mungkin Anda bisa langsung mengekstrak digitnya. Seperti ...

$ echo "pid: 1234" | grep -Po "\d+"

Ini mungkin solusi yang lebih kuat, dan tampaknya lebih intuitif.

pengguna1751825
sumber