如何在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”)
,因此将此处的单引号转换为双引号。