Php 带replace的sed正则表达式

Php 带replace的sed正则表达式,php,regex,replace,sed,Php,Regex,Replace,Sed,给定一个文件: <? $dbo = mysql_fetch_assoc(); $dbo->employee_id; $dbo->employee_name; $dbo->dirt; $dbo->dirt23; $dbo->dirt_2_3; ?> 它总是返回一个错误。我曾尝试使用撇号作为容器,正确地转义所有内容,并使用正斜杠作为命令分隔符,但没有效果 结果应该是: <? $dbo = mysql_fetch_assoc(); $

给定一个文件:

<?

$dbo = mysql_fetch_assoc();

$dbo->employee_id;

$dbo->employee_name;

$dbo->dirt;

$dbo->dirt23;

$dbo->dirt_2_3;

?>
它总是返回一个错误。我曾尝试使用撇号作为容器,正确地转义所有内容,并使用正斜杠作为命令分隔符,但没有效果

结果应该是:

<?

$dbo = mysql_fetch_assoc();

$dbo['employee_id'];

$dbo['employee_name'];

$dbo['dirt'];

$dbo['dirt23'];

$dbo['dirt_2_3'];

?>


请提供帮助。

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

cat test.php | sed -E "s/dbo->([a-z_]*.*);/dbo[\'\1\']/g"

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

sed -e "s|\$dbo->([\w_]*)|$dbo['\1']|g" test.php
顺便说一句,产生错误的是
\\
。unscaped$不会给您一个错误,它只会使正则表达式无法匹配任何内容,因为您正在尝试匹配字符串的结尾,然后是结尾后的一些内容。但是
\\
没有任何意义;必须是
\\\
才能在字符类中同时包含反斜杠和下划线,或者只有
\\
才能包含下划线。

错误很少:

  • \w
    已包含下划线
  • $
    需要删除
  • 方括号需要去掉
  • 您在双引号中使用了
    $
    ,同时可以通过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"
    
    您可以使用此选项(基本模式):


    您可以使用
    mysql\u fetch\u object()
    。我要离开mysql\u fetch\u对象。它比mysql\u fetch\u assoc慢,信不信由你。我想让关联数组用于与所问问题无关的特定用途。谢谢。试过了。失败。错误是:sed:-e表达式#1,char 25:s命令的RHSWorks上的无效引用\1,但唯一的问题是我想使用“而不是”导致['\2'],但转义撇号无效。我试图避免:alnum:因为我对它的另一个用法不支持它。确定您可以尝试:
    sed-r“\$s/(dbo->”)([a-zA-Z0-9+)()$/\1['\2']\3/g“
    我将“\$s/”更改为“s/”,这是我想要的。另一个细微的更改是删除(.*)和\3:sed-r“s/(dbo->)([a-zA-Z0-9\]+)/\1['\2']/g”test.php使这行替换正确:$dbo->['employee\u name'].'.$dbo->employee_address;它不是原始文件的一部分,但…需要。感谢您和其他人!最终答案:sed-r“s/$dbo->([a-zA-Z0-9_]+)/$dbo['\1']/g”test.php-1双引号中的
    $dbo
    将被shell替换。
    sed -r "\$s/(dbo->)([a-zA-Z0-9_]+)(.*)$/\1['\2']\3/g"
    
    sed "s/\$dbo->\([^;]\+\)/\$dbo['\1']/" file.php