Bagaimana saya bisa menghapus teks sebelum pembatas di Linux


16

Saya perlu menghapus teks dari baris sebelum pembatas.

Sebagai contoh:

(123434): hello::{apple,orange,mango}.

Saya perlu menghapus teks sebelum terlebih dahulu :. yaitu (123434).

Apakah ada perintah di linux untuk melakukan tugas ini?


Anda mungkin ingin melihat sedatauawk
Paul

Apakah teks ini bagian dari file, atau bagian dari variabel bash?
Bernhard

Itu adalah bagian dari file.
user80538

Jawaban:


14

sedPerintah ini harus melakukan trik. Perintah berikut akan menimpa file:

sed -i 's/^[^:]*:/:/' file

Untuk hanya mencetak hasilnya, hapus -ibendera. Untuk meletakkan output di file baru, hapus -iflag dan redirect output:

sed 's/^[^:]*:/:/' file > new_file

Baris melakukan keajaiban ... output diganti dalam file itu sendiri ..
user80538

Ketika saya membandingkan dua file menggunakan sdiff, setelah menghapus teks dari kedua file, perbedaannya menunjukkan kepada saya teks yang dihapus untuk saya. perintah ini menimpa file atau hanya menampilkan output.
user80538

Berhasil .. Bisakah saya mengekstrak 'hello' dan {apple, orange, mango} dari contoh saya dengan membuat perubahan sederhana pada perintah di atas?
user80538

@ user80538, Sulit untuk mengatakan apa yang Anda inginkan ketika Anda mengatakan ekstrak dalam konteks ini. Apakah ini bagian dari skrip shell yang lebih besar? Anda mungkin ingin mengajukan pertanyaan baru dengan perincian masalah yang lebih besar yang Anda coba selesaikan.
drs

Ini hanya perbandingan sederhana dari dua file dengan data yang sama tetapi hanya perlu menemukan di mana data berbeda dalam dua file. Saya perlu memeriksa setiap bagian individu di baris. Data di bagian individu dapat campur aduk. seperti {apel, jeruk, mangga} bisa {apel, mangga, jeruk}.
user80538

14

Anda bisa menggunakan cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Anda dapat melakukan ini dengan instruksi Bash yang cukup sederhana :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Ini akan dicetak : hello::{apple,orange,mango}.. Anda dapat memotong prefiks dan sufiks dengan cara yang sama. Selain itu, definisi awalan dan sufiks dapat berisi wildcard.

Potong awalan - hingga pencocokan wildcard awalan pertama: ${variable#prefix}

Potong awalan - hingga pertandingan wildcard awalan terakhir: ${variable##prefix}

Potong sufiks - hingga pertandingan wildcard sufiks pertama: ${variable%suffix}

Potong sufiks - hingga pertandingan wildcard sufiks terakhir: ${variable%%suffix}

Mungkin terlihat tidak jelas pada pandangan pertama, lihat contoh berikut:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

Dalam contoh terakhir, pola tidak cocok, jadi tidak ada yang dipotong.


Akan lebih kuat untuk digunakan echo ${mytext#*:}:. Ini akan menangani garis seperti (123)(434): hello::{apple,orange,mango}.dan 123434: hello::{apple,orange,mango}.
drs

apakah ada cara untuk mengubah perintah echo $ {mytext %% B *} untuk mendapatkan teks setelah B. dalam contoh Anda
user80538

@ user80538 ya, cukup potong teks sebelum B, inklusif ;-), yaitu: $ {mytext # * B} untuk teks setelah B pertama, dan $ {mytext ## * B} untuk teks setelah B. kedua
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.