用null替换此模式的Sed

时间:2017-09-11 07:55:50

标签: regex linux sed

具有此格式的字符串

aaa,bbb,ccc,ddd,pattern:[[xxxxxxxxxxxx],[yyyyyyyyyyyyyyy]],eee,fff,pattern:[[eeeeeeeeee],[fffffffff]]

如何使用sed替换模式:[[ ???????????? ]]为null

示例

sed s/pattern:[[ ????????? ]]//g

我试过sed s/pattern:\[\[\([^]]*\)\]\]//g 但它不起作用。

5 个答案:

答案 0 :(得分:0)

您可以使用perlsed不支持非贪婪匹配:

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种类型的模式:

  • 图案:[[AAA],[BBB],...,[XXX],[YYY]]
  • 图案:[[AAAAA]]
  • 图案:[]

解决方案是:

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