使用sed将“file = {{bla-bla}}”替换为“file = {bla-bla}”

时间:2015-06-12 19:43:47

标签: regex sed

我的bibtex文件在我需要更改的意义上已损坏 file = {{name:/path/to/file.pdf:application/pdf}}, 使用file = {name:/path/to/file.pdf:application/pdf},即删除第一对花括号。 我感兴趣的所有字符串都以file = {{开头。

我的第一次尝试是 echo "file = {{name:/path/to/file.pdf:application/pdf}}," | sed 's/file = {{/file = {/g;s/}}/}/g' 这个问题是它也改变了像 title = {{ blablabla }}我不想这样做。

如何使用s/file = {{EVERYTHING-IN-BETWEEN/file = {KEEP-WHAT-WAS-THERE}/g

之类的东西编写REGEX

P.S。如果sed无法使用,则欢迎使用任何其他unix命令。

p.p.s。我在OS-X上,这里的sed与GNU明显不同,所以不幸的是,下面的一些答案对我不起作用。

4 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

sed 's/\(file = \){\({[^}]*}\)}/\1\2/g'

答案 1 :(得分:2)

这可能对您的情况有误,但这会将任何双重支撑改为单支撑:

sed  's/\([{}]\)\1/\1/g' <<END
{{
}}
file={{bar-blah}}
{}
}{
END
{
}
file={bar-blah}
{}
}{

搜索部分\([{}]\)\1找到一个打开或关闭的大括号,然后是刚捕获的内容。替换部分是单个捕获的角色。

答案 2 :(得分:1)

假设开始和结束括号都在同一行,并且同一行上没有其他对括号,那么这应该做你想要的:

sed '/file *= *{{/{s/{{/{/; s/}}/}/}' file

这是:

  • /file = {{/ - 匹配其上有file = {{的行
  • { - 启动一组命令
  • s/{{/{/ - 将{{替换为{一次
  • s/}}/}/ - 将}}替换为}一次
  • } - 结束一组命令

如果OS X sed无法处理该命令,并且没有命令分组的此版本也不起作用:

sed '/file *= *{{/s/}}/}/; /file *= *{{/s/{{/{/'

然后,希望这应该:

sed -e '/file *= *{{/s/}}/}/' -e '/file *= *{{/s/{{/{/'

或者,从glenn jackman's answer偷走一点:

sed -e '/file *= *{{/s/\([{}]\)\1/\1/g'

答案 3 :(得分:0)

呵呵,GNU sed

echo "file={{bla-bla}}" | sed 's/\(file\s*=\s*\){\s*{\s*\([^}]*\)}\s*}\s*/\1{\2}/'  

文件= {BLA-BLA}
\ s正在捕捉最终的空白字符

假设'}'不在内部字符串

相关问题