Perl

搜尋和替換不尊重我的“$1”令牌

  • April 11, 2017

在 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;/' 

引用自:https://unix.stackexchange.com/questions/358347