Saya memiliki file hashes yang memiliki banyak baris yang terlihat seperti ini:

wget https://ipfs.io/ipfs/QmbKi6XiMmf4YfvKXhqVPymD1HDwJ3WqukjyLuEvnrZrCz The_Supremes_-_My_World_Is_Empty_Without_You_(lyrics).mkv

Semua baris di hashes akan mengikuti pola:

wget https://ipfs.io/ipfs/hashthatis46characterlong nameOfAfileWithoutSpaces

Karena ditulis oleh skrip saya dengan baris kode berikut:

find ~/pCloudDrive/VisualArts/Films/Fiction_Movies -maxdepth 1 -type f -size +200M -exec ipfs add --nocopy {} \;>>~/CS/ipfs/hashes && \
sed -i 's;added ;wget https://ipfs.io/ipfs/;g' ~/CS/ipfs/hashes

Semua hash akan memiliki panjang 46 karakter dan biasanya mulai dengan 'Qm' tapi ini belum tentu kasus di masa depan.

Saya ingin mengganti spasi kedua setiap baris file ini dengan ' -O ' sehingga terlihat seperti:

wget https://ipfs.io/ipfs/hashthatis46characterlong -O nameOfAfileWithoutSpaces

Saya mencoba sed 's/[0-9A-z]{46,46}\s/& -O /g' hashes tetapi tidak berhasil - saya mendapatkan hasil berikut:

sed: -e expression #1, char 27: Invalid range end

Bagaimana cara melakukannya? Akankah awk memberikan solusi yang lebih baik untuk masalah ini daripada sed?

2
Jerzy Brzóska 27 Mei 2021, 08:11

4 jawaban

Jawaban Terbaik

Sesederhana ini

sed 's/ / -O /2' input

Di mana trailing 2 dalam perintah sed berarti "kemunculan kedua".

2
Enlico 27 Mei 2021, 05:14

awk lainnya:

$ awk '{$3="-O" OFS $3}1' file
1
kvantour 27 Mei 2021, 06:44

Karena Anda memiliki nameOfAfileWithoutSpaces dimungkinkan untuk mendapatkan hasil yang diinginkan dengan cara lain menggunakan GNU sed, yaitu:

s/\([^[:space:]]*\)$/-O \1/

Ini menangkap karakter non-spasi yang diikuti oleh akhir baris ($) kemudian diganti dengan -O diikuti oleh karakter ini. Saya menguji menggunakan sed.js.org dan untuk masukan

wget https://ipfs.io/ipfs/hashthatis46characterlong nameOfAfileWithoutSpaces
wget https://ipfs.io/ipfs/hashthatis46characterlong anotherName

Keluarannya adalah

wget https://ipfs.io/ipfs/hashthatis46characterlong -O nameOfAfileWithoutSpaces
wget https://ipfs.io/ipfs/hashthatis46characterlong -O anotherName
2
Daweo 27 Mei 2021, 07:21

Menggunakan GNU awk dan gensub() untuk mengubah kemunculan kedua pada setiap record:

$ awk '{print gensub(/ /," -O ","2")}' file

Sebagai contoh:

$ echo 1 2 3 4 5  | awk '{print gensub(/ /," -O ","2")}'
1 2 -O 3 4 5
3
Jerzy Brzóska 27 Mei 2021, 05:45