我的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
?
P.S。如果sed
无法使用,则欢迎使用任何其他unix命令。
p.p.s。我在OS-X上,这里的sed与GNU明显不同,所以不幸的是,下面的一些答案对我不起作用。
答案 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正在捕捉最终的空白字符
假设'}'不在内部字符串
中