Saya memiliki skrip bash untuk mengganti nilai angka di dalam pola teks. Misalkan saya memiliki file seperti ini:
word5word
word55word
Dan saya ingin terlihat seperti ini:
word125word
word125word
Saya memiliki skrip ini untuk melakukan itu:
#!/bin/bash
re='([0-9]|[0-9][0-9])'
while read line
do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done < /home/tomak/test.txt
Untuk beberapa alasan, ekspresi 're' tidak ditafsirkan dengan benar dan itu mencetak baris aslinya. Saya tidak tahu mengapa. Ini berfungsi untuk satu digit, yaitu re='[0-9]'
.
Untuk merumuskan ekspresi, saya menggunakan informasi dari Bash Guide for Beginners yang menyatakan bahwa:
Dua ekspresi reguler dapat digabungkan dengan operator infiks “|”;
ekspresi reguler yang dihasilkan cocok dengan semua string yang cocok dengan subekspresi
.
Tapi itu tidak bekerja untuk saya. Apa yang saya lewatkan?
Perhatikan bahwa saya mencoba mengatur shopt -s extglob
dan rumuskan ekspresi seperti [0-9][0-9]?
tapi itu juga tidak berhasil.
Saya menggunakan Ubuntu 14.10 dan memiliki stock bash versi 4.3.30. Saya menjalankan skrip dengan bash foo.sh
.
Jawaban yang Diterima:
Substitusi ekspansi parameter tidak berfungsi dengan ekspresi reguler. extglob
dapat membantu Anda di sini, tetapi juga tidak berfungsi dengan ekspresi reguler.
Sintaks yang benar untuk ekspresi di bawah extglob
adalah
re='+([0-9])'
yaitu satu digit satu kali atau lebih.
Tes:
re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done
Keluaran:
word125word
word125word