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

搜尋和替換不尊重我的“$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';

答案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

相關內容