Bash Sed:在字符最后一次出现之前追加

Bash Sed:在字符最后一次出现之前追加,bash,sed,Bash,Sed,假设我有以下文件: public class Foo { // Some code // There will be functions here, so there are other {} // I WANT TO INSERT HERE } 我想在Foo类中插入一个函数。这将正好在}最后一次出现之前 我如何在sed中执行此操作 编辑 一个既能在Mac上运行又能在Linux上运行的脚本怎么样 sed '$s/\(}\)/Put thing here\n\1/' $i

假设我有以下文件:

public class Foo {
   // Some code
   // There will be functions here, so there are other {}

   // I WANT TO INSERT HERE
}
我想在Foo类中插入一个函数。这将正好在}最后一次出现之前

我如何在sed中执行此操作

编辑

一个既能在Mac上运行又能在Linux上运行的脚本怎么样

sed '$s/\(}\)/Put thing here\n\1/' 

$in front直接匹配最后一行,因此如果}不在文件的最后一行,它将不起作用。

假设文件中有多个类和其他数据:

sed '/Foo/,/^}/s%^}%\t//New insert\n}%' file
在一天结束时,您总能找到一些与您的解决方案不太匹配的东西,因此您可能需要了解您的数据:

下面还将在一行处理类定义:

sed -e '/Foo/,/^}/s%^}%\t//New insert\n}%' -e '/Foo.*}$/s%}$%\t //New insert\n}%' file

这在RedHat的GNU Sed 4.2.2中完成了这项工作,如果您愿意,可以对其进行测试

$ sed -n '/class Foo2 {/,/^}$/{s/^}$/Insert here\n\0/};p' file

我假设文件可以包含更多的类,我尝试在文本中间的FoO2结尾插入我的文本插入。p> 测试:

$ cat file2
public class Foo {
   // Some code
   // There will be functions here, so there are other {}
}
public class Foo2 {
   // Some code
   // There will be functions here, so there are other {}
}
public class Foo3 {
   // Some code
   // There will be functions here, so there are other {}
}


$ sed -n '/class Foo2 {/,/^}$/{s/^}$/Insert here\n\0/};p' file2
public class Foo {
   // Some code
   // There will be functions here, so there are other {}
}
public class Foo2 {
   // Some code
   // There will be functions here, so there are other {}
Insert here
}
public class Foo3 {
   // Some code
   // There will be functions here, so there are other {}
}
说明: /类Foo2{/,/^}$/-范围-从类名Foo2{到第一个^}$ {s/^}$/Insert here\n\0/}-替换零件。将^}$替换为文本加新行加替换部分\0 ;p:打印

BSD的更新 在@ghoti的帮助下,在设置FreeBSD机器进行测试之后,这似乎只适用于FreeBSD bash:

sed -n "/class Foo2 {/,/^}\$/{s/^}\$/Insert here \\"$'\n'" &/;};p" file
请注意,如果shell不是bash,这将不起作用。无论如何你都可以试试。

试试这个:

sed -i '/^\(}\)/ i new_function' file

在Debian上为我工作。

是否有多个}?如果没有像sed s/}/$Yourstuff}/@MikeWodarczyk这样用$Yourstuff}替换},会有更多的}前面没有空格的}会有更多的}吗?你能把我想在这里插入的字符串//放到文件中吗?然后你可以用你想要的字符串替换这个字符串。现在还不清楚如何区分关闭类的}和文件中可能存在的任何其他}。你真的需要能够解析文件中任何语言的东西,而不是正则表达式。如果类都是一行,例如类{…{},这就行不通了。。。此外,在某些版本的sed上,\t或\n将只打印t或n而不是制表符/新行。如果必须,请随时向下投票。我已经详细说明了我的sed将在何时工作。我在问题中没有看到足够的信息来说明}是否在最后一行,所以只是针对一个简单的情况给出一个简单的答案。不,我不能这样做,我没有批评你的努力,只是OS X上的行为将字符串放在了{}之前的最后一行。对不起……我不知道。我在linux上用GNU sed测试了这个功能。@l'l'l-不,OSX使用的是来自FreeBSD的sed,而不是GNU sed。也许你在想格雷普。@ghoti:也许就是这样;我的观点是,相同的工具在操作和结果上可能因平台而异。OP没有指定他们使用的是哪一种,但无论如何都可能要注意。@Kousha Hm。。。不好的。我也尝试过sed-posix,效果很好。你用什么sed版本?@Kousha顺便说一下,你知道你可以在你的mac上安装gsed=gnu sed,对吗?该脚本将在非GNU sed环境下工作,只需进行简单的调整,也可以在GNU sed环境下工作。可移植性是指使代码在一种语言的多个实现中运行,而不是使特定的实现在多个系统中无处不在。@ghoti你是对的,一个好的代码必须是可移植的。我是一个业余爱好者,我不能测试我的脚本到一个非GNU使用。。。如果你知道如何测试这个,我愿意修复它。PS:我没有发现任何在线终端配备非GNU sed来进行必要的调整,即类似于我使用@ghoti的TutorialPoint bash在线终端的东西,我觉得奇怪的是,这个脚本成功地运行了-posix开关,理论上禁用了GNU扩展。显然,gnu-sed-posix和非gnu-sed有更多的区别。