Perl
搜尋和替換不尊重我的“$1”令牌
在 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';
這將做到:
sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv
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;/'