Saya memiliki kode di bawah ini.
awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="lineNum" 'NR==lineNum{gsub(bookName, newTitle)}1'
Kode ini pada dasarnya memperbarui judul buku ke judul baru. lineNum
berisi nilai nomor baris yang telah disetel tetapi kodenya tidak ditampilkan di sini.
Saya ingin baris kode ini mengabaikan kasus bookName, tetapi kode berikut yang saya coba tidak berfungsi.
awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="$lineNum" 'BEGIN{IGNORECASE=1} NR==lineNum{gsub(bookName, newTitle)}1'
Mengapa begitu?
Edit berdasarkan balasan John
* Edit Terbaru: Jadi pada dasarnya kode saya adalah seperti di bawah ini:
read -r bookName
read -r authorName
if grep -iqx "$bookName:$authorName" cutText.txt
then
lineNum=`awk -F":" -v bookName="$bookName" 'BEGIN{IGNORECASE=1} $0 ~ bookName ":" authorName {print NR}' BookDB.txt`
echo $lineNum
else
echo "Failed"
fi
CutText.txt berisi:
Hairy Potter:Rihanna
MARY IS A LITTLE LAMB:Kenny
Sing along:May
BookDB.txt berisi:
Hairy Potter:Rihanna:2:5:20
MARY IS A LITTLE LAMB:Kenny:39:2:1
Sing along:May:38:2:48
Jika saya memasukkan "Mary is a little lamb" sebagai bookName
dan "Kenny" sebagai authorName
, program seharusnya menampilkan 2
. Namun, $lineNum
tidak menghasilkan output apa pun.
1 menjawab
IGNORECASE adalah spesifik gawk, Anda tidak boleh menggunakan gawk. portabel:
awk ... '
NR==lineNum {
if ( match(tolower($0),tolower(bookName)) ) {
$0 = substr($0,1,RSTART-1) newTitle substr($0,RSTART+RLENGTH)
}
print
}
'
Tetapi Anda benar-benar harus memulai kembali dengan seluruh skrip Anda karena campuran Shell+grep dan menggunakan awk untuk mendapatkan nomor baris hanyalah pendekatan yang salah. Posting pertanyaan baru untuk bantuan tentang cara menulis skrip Anda dengan benar.
-v lineNum="lineNum"
dengan-v lineNum="$lineNum"
, itu berfungsi dengan baik untuk saya.lineNum
tidak mencetak NR, sehingga kode yang saya posting di pertanyaan tidak berfungsi. Kode ditunjukkan di bawah ini:lineNum=`awk -v bookName="$bookName" -v authorName="$authorName" ' BEGIN{IGNORECASE=1} $0 ~ bookName ":" authorName {print NR}' BookDB.txt
` Ketika saya mencoba menggemakan$lineNum
, tidak ada yang tercetak. Saya kira ini adalah akar masalahnya.gawk
.IGNORECASE
adalah bawaan khusus gawk.