[英]Escape single quotes in sed
我有一個字符串:
'driver' => 'Cake\Database\Driver\Mysql'
我需要替換為:
'foo' => 'bar'
但是我的sed命令似乎都不正確,例如
sed -i "s/\x27driver\x27 => \x27Cake\Database\Driver\Mysql\x27/\x27driver\x27 => \x27Cake\Database\Driver\Postgres\x27/g" /path/to/file.ext
要么
sed -i "s/'driver' => 'Cake\Database\Driver\Mysql'/'driver' => 'Cake\Database\Driver\Postgres'/g" /path/to/file.ext
我該如何進行替換?
謝謝!
您可以使用:
SQ=$'\x27'
sed "s/${SQ}driver${SQ} => ${SQ}Cake\\\\Database\\\\Driver\\\\Mysql${SQ}/${SQ}driver${SQ} => ${SQ}Cake\\\\Database\\\\Driver\\\\Postgres${SQ}/" file
'driver' => 'Cake\Database\Driver\Postgres'
您需要使用\\\\\\\\
來匹配\\
並匹配單引號,以定義一個變量,如上所示。
這對我使用GNU sed有用,但我不確定為什么它不可移植:
$ path='Cake\\Database\\Driver\\Mysql'
$ sed "s/'driver' => '${path}'/'foo' => 'bar'/" <<<"'driver' => 'Cake\\Database\\Driver\\Mysql'"
'foo' => 'bar'
在雙引號內,可以直接使用單引號。 為了簡化sed行,我將路徑移至了變量。
這可以在此處進行快速測試:
sed "s/'driver' => 'Cake\\\Database\\\Driver\\\Mysql'/'driver' => 'Cake\\\Database\\\Driver\\\Postgres'/g"
您必須轉義反斜杠: \\
:
kent$ sed "s#'driver' => 'Cake\\\\Database\\\\Driver\\\\Mysql'#'foo' => 'bar'#"<<<"'driver' => 'Cake\Database\Driver\Mysql'"
'foo' => 'bar'
kent$ sed 's/\x27driver\x27 => \x27Cake\\Database\\Driver\\Mysql\x27/\x27foo\x27 => \x27bar\x27/'<<<"'driver' => 'Cake\Database\Driver\Mysql'"
'foo' => 'bar'
不是Linux的人,只是在這里猜測。
Perl引擎處理器應該看到的內容:
s/'driver' => 'Cake\\Database\\Driver\\Mysql'/'driver' => 'Cake\\Database\\Driver\\Postgres'/g
命令處理器的單引號:
sed 's/\'driver\' => \'Cake\\\Database\\\Driver\\\Mysql\'/\'driver\' => \'Cake\\\Database\\\Driver\\\Postgres\'/g' /path/to/file.ext
給命令處理器加雙引號:
sed "s/'driver' => 'Cake\\\\Database\\\\Driver\\\\Mysql'/'driver' => 'Cake\\\\Database\\\\Driver\\\\Postgres'/g" /path/to/file.ext
給出的答案對我來說都不完全像寫的那樣,因此我將它們用作測試的靈感,並發現對我有用:
sed -i 's/\x27driver\x27 => \x27Cake\\\Database\\\Driver\\\Postgres\x27/\x27driver\x27 => \x27Cake\\\Database\\\Driver\\\Mysql\x27/g' /path/to/file.ext
sed -i 's/\x27driver\x27 => \x27Cake\\\Database\\\Driver\\\Mysql\x27/\x27driver\x27 => \x27Cake\\\Database\\\Driver\\\Postgres\x27/g' /path/to/file.ext
或者,以foo-bar為例:
sed -i 's/\x27driver\x27 => \x27Cake\\\Database\\\Driver\\\Mysql\x27/\x27foo\x27 => \x27barx27/g' /path/to/file.ext
謝謝大家,特別是@Kent和@anubhava
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.