2014-12-04 81 views
1

我希望使用sed删除每个字符串中特定符号的第N个出现次数和最后一个第N个出现次数。例如,我想从下面的字符串中删除第一个和最后一个方括号。嵌套括号的数量是未知的,也可能是只有匹配时使用sed才能从字符串中删除第N个和最后一个第N个字符

[{串[子]串}]

[[[{串[子]串}] ]]

后SED应该离开

{串[子]串}

我尝试的replace up to nth matchHow to remove the last character from all lines but only if it is a certain character逻辑以下,但无法找到,对于嵌套括号的不明量工作的公式。

最坏的情况我可以递归地测试字符串以获取嵌套括号的数量,然后删除该字符数。这会是一个更好的方法,公式会是什么样子?我试图sed -r 's/.{2}//' -e 's/ .{2}$//'没有运气

THX 艺术

回答

2

您不必算括号,你只需要使用适当的模式。你可以这样说:

sed "s/^\[*{/{/;s/}\]*$/}/" 

有两种模式这里更换,s表示替换是什么/之前,什么是后:

s/^\[*{/{/ 

这人会寻求{任何金额从字符串的开头开始的[^ - 表示字符串的开头,*表示任何东西,使用\我们转义[。所以我们在这里用{代替^\[*{

s/}\]*$/}/ 

反之亦然情况是在这里,但我们寻求}]直到字符串的结尾任何金额。 $意味着结束。我们用}代替}\]*$

+0

谢谢@SandyElms的魅力。你能解释一下这个公式中发生了什么。我得到[*&\] *设置通配符第N个数字,但是{/ {/ do? – 2014-12-04 23:07:09

相关问题