簡體   English   中英

在sed中轉義單引號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM