具有此格式的字符串
aaa,bbb,ccc,ddd,pattern:[[xxxxxxxxxxxx],[yyyyyyyyyyyyyyy]],eee,fff,pattern:[[eeeeeeeeee],[fffffffff]]
如何使用sed替换模式:[[ ???????????? ]]
为null
示例
sed s/pattern:[[ ????????? ]]//g
我试过sed s/pattern:\[\[\([^]]*\)\]\]//g
但它不起作用。
答案 0 :(得分:0)
您可以使用perl
,sed
不支持非贪婪匹配:
s='aaa,bbb,ccc,ddd,pattern:[[xxxxxxxxxxxx],[yyyyyyyyyyyyyyy]],eee,fff,pattern:[[eeeeeeeeee],[fffffffff]]'
perl -pe 's/pattern:\[\[.*?\]\]//g' <<< "$s"
aaa,bbb,ccc,ddd,,eee,fff,
答案 1 :(得分:0)
将其用作测试文件:
$ cat file
aaa,bbb,ccc,ddd,pattern:[[xxxxxxxxxxxx],[yyyyyyyyyyyyyyy]],eee,fff,pattern:[[eeeeeeeeee],[fffffffff]]
使用sed:
$ sed 's/\]\]/\n/g; s/pattern:\[\[[^\n]*\n//g; s/\n/]]/g' file
aaa,bbb,ccc,ddd,,eee,fff,
因为sed没有非贪婪的正则表达式,所以我们必须使用一个技巧:
s/\]\]/\n/g
这会替换所有出现的]]
换行符。
s/pattern:\[\[[^\n]*\n//g
这会替换所有出现的pattern:[[
,后跟任何非换行符[^\n]*
,后跟换行符\n
,后面带有空字符串。
s/\n/]]/g
如果仍有任何换行符\n
,则会将其更改回]]
。
答案 2 :(得分:0)
使用 awk :
awk -v RS='pattern:\\[\\[|\\]\\]' 'NR%2' ORS= s1 file
RS='pattern:\\[\\[|\\]\\]'
- 将pattern:[[
和]]
视为复杂记录分隔符(基于正则表达式备用组...|...
)输出:
aaa,bbb,ccc,ddd,,eee,fff,
答案 3 :(得分:0)
如果你可以保证它总是看起来有像
这样的方括号pattern:[[abc],[def],...,[stu],[vxy]]
那么你可以这样做:
sed 's/pattern:\[\{2\}[^]]*\(\],\[[^]]*\)*\]\{2\}//g'
这是一个以2&#39; [&#39;然后是任何不是结束括号的东西,然后是可选的&#39;],[&#39;以及任何不是结束括号并以&#39;]]&#39;
结束的任何事情<强>更新强>
修订后的要求支持以下3种类型的模式:
解决方案是:
sed 's/pattern:\[\{1,2\}[^]]*\(\],\[[^]]*\)*\]\{1,2\}//g'
答案 4 :(得分:0)
这可能适合你(GNU sed):
sed 's/\[\[[^]]*\]\(,\[[^]]*\]\)*\]//g' file
正则表达式遵循模式(re Friedl):
sed 's/normal(special normal)*/replacement/g' file