3

给定一个文件:

<?

$dbo = mysql_fetch_assoc();

$dbo->employee_id;

$dbo->employee_name;

$dbo->dirt;

$dbo->dirt23;

$dbo->dirt_2_3;

?>

并使用 sed 查找和替换:

sed -e "s|$dbo->([\w\_]*)|$dbo['\1']|g" test.php

它总是返回一个错误。我尝试使用撇号作为容器并正确转义所有内容并使用正斜杠作为命令分隔符,但无济于事。

结果应该是:

<?

$dbo = mysql_fetch_assoc();

$dbo['employee_id'];

$dbo['employee_name'];

$dbo['dirt'];

$dbo['dirt23'];

$dbo['dirt_2_3'];

?>

请帮忙。

4

4 回答 4

3

几个错误:

  1. \w已经包含下划线
  2. $需要克服
  3. 方括号需要去掉
  4. 您在$由 shell 扩展时使用内部双引号

使用以下 sed:

sed -r 's/(\$dbo->)([[:alnum:]_]+)(.*)$/\1["\2"]\3/g'

或者在 OSX 上:

sed -E 's/(\$dbo->)([[:alnum:]_]+)(.*)$/\1["\2"]\3/g'

对于使用单引号:

sed -r "\$s/(dbo->)([a-zA-Z0-9_]+)(.*)$/\1['\2']\3/g"
于 2013-07-21T17:09:15.687 回答
0

您也许可以使用它(基本模式):

sed "s/\$dbo->\([^;]\+\)/\$dbo['\1']/" file.php
于 2013-07-21T17:28:25.180 回答
0

如果您使用的是 Mac OSX,则需要 -E 开关而不是 -e,并使用以下命令而不是您拥有的命令:

cat test.php | sed -E "s/dbo->([a-z_]*.*);/dbo[\'\1\']/g"
于 2013-07-21T16:39:52.943 回答
0

您正在转义一个不需要转义的字符,而不是转义另一个确实需要转义的字符。_不是正则表达式元字符,但$(匹配字符串的结尾)。做到这一点:

sed -e "s|\$dbo->([\w_]*)|$dbo['\1']|g" test.php

顺便说一句,这\_是产生错误的原因。未转义的$不会给你一个错误,它只会使正则表达式无法匹配任何东西,因为你试图匹配字符串的结尾,然后是结尾之后的一些东西。但\_不代表什么;它必须要么\\_在字符类中同时包含反斜杠和下划线,要么只_包含下划线。

于 2013-07-21T16:55:35.517 回答