如何在sed中实现以下目标?

如何在sed中实现以下目标?,sed,Sed,原文是: apr_array_pstrcat(anythingbutalwayshereincludingspaces,anythingbutalwayshereincludingspaces, ',') 我想将其更改为: apr_array_pstrcat(samethingasabove,samethingasabove, ", ") 我获得了以下sed命令,但它不起作用: find . -type f -exec sed -i "s/apr_array_p

原文是:

apr_array_pstrcat(anythingbutalwayshereincludingspaces,anythingbutalwayshereincludingspaces, ',')
我想将其更改为:

apr_array_pstrcat(samethingasabove,samethingasabove, ", ")
我获得了以下sed命令,但它不起作用:

find . -type f -exec sed -i "s/apr_array_pstrcat\((.*),(.*),(.*)','\)/apr_array_pstrcat\($1,$2,$3\", \"\)/g" {} +

我该怎么做?我能够理解PCRE正则表达式,但我不确定这个sed正则表达式。

OP尝试的问题:

  • 启用ERE需要
    -E
    ,否则
    \(
    需要使用默认BRE反转
  • $1
    $2
    等应为
    \1
    \2
  • 根据给定的样本,应该只有两个捕获组
  • 此外,如果每行只能有一个匹配项,则不需要使用
    g
    标志
sed-E“s/apr\u array\pstrcat\(.*),(.*),,\)/apr\u array\u pstrcat\(\1,2\,\)/g”
这可以简化为:

sed-E“s/(apr\u数组\pstrcat\(.*),(.*),\)/\1、\2\,\”)/g”
#或者这个,因为对整个表达式使用双引号会导致
#与shell双引号解释冲突
sed-E的/(apr\u数组\pstrcat\(.*),(.*)\x27\x27\)/\1\2“,“\)/g'
这可以根据输入中存在的数据类型进一步简化:

#将“,”更改为“,”如果行包含apr\u数组\pstrcat(
sed'/apr\u数组\pstrcat(/s/\x27、\x27/,“/”
sed有-E标志表示“在脚本中使用扩展正则表达式”

我还将参数与“任何非逗号的内容”匹配:“[^,]+”

这对我来说很有用:

sed -E "s/(apr_array_pstrcat\([^,]+, [^,]+,) ','\)/\1 \", \")/"

-E
添加到
-i
之后,我正在将其与find命令一起使用。请创建包含find命令的sed命令。这可能是问题所在?完整命令是:
find.-type f-exec sed-iE's/(apr\u array\u pstrcat\(.*),(.*)\x27\x27\/\1\2',“\)/g'{}+
您需要使用
-i-E
而不是
-iE
…也请在您的数据副本上进行实验是的,我正在副本上进行实验。另外,我如何将
apr\u array\pstrcat(anythingbutalwayshereincludingspaces,anythingbutalwayshereincludingspaces,'anythinghere')
更改为
apr\u array\pstrcat(samethingasabove,samethingasabove,“samethingasabove”)
,因此将此处的单引号转换为双引号。