在 Ubuntu 14.04 上使用 bash shell。嘗試對文件的每一行進行簡單的搜尋和替換。我努力了
perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv
但這給我留下了一個充滿的文件
DELETE FROM my_object_times where ID = '';
我想要捕捉的所有內容根本沒有插入。進行此搜尋和替換的更好方法是什麼?我預計最終結果會是這樣的
DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';
答案1
perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv
由於 Perl 程式碼片段位於雙引號中,因此 shell 將擴展$1
到其目前值(在您的情況下可能為空或未設定)。您需要轉義美元符號來防止這種情況發生。此外,您在運算符的模式中沒有捕獲組s///
,因此$1
不會包含任何內容。 (perl -w
或者use warnings
會警告你這一點。)
在模式上加上括號,或使用$&
.另外,全域替換似乎不適用於零寬度的模式,因此我建議刪除g
- 標誌。
所以:
perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/"
(雖然&
不是 shell 中的有效變量,所以$&
將保持原樣。但一般來說,需要$
轉義。)
通常,將 Perl 代碼放在單引號中會更好,因為美元符號在 Perl 中很常見。但這裡 Perl 程式碼中的單引號讓這有點困難。一種選擇是將它們以十六進製表示:
perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/'
答案2
這將做到這一點:
sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv