Sed:在最后一个字符出现之前附加

时间:2017-02-22 02:55:55

标签: bash sed

说我有以下文件:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

,        44 0054 0x2c
.        46 0056 0x2e
^[,      27 0033 0x1b
         44 0054 0x2c
^[.      27 0033 0x1b
         46 0056 0x2e

我想在public class Foo { // Some code // There will be functions here, so there are other {} // I WANT TO INSERT HERE } 类中插入一个函数。这将在Foo的最后一次出现之前。

我怎样才能在sed中这样做?

修改

适用于Mac和Linux的脚本怎么样?

4 个答案:

答案 0 :(得分:1)

试试这个:

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

在Debian上为我工作。

答案 1 :(得分:0)

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

$会立即与最后一行匹配,因此如果}不在文件的最后一行,它将无效。

答案 2 :(得分:0)

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

sed '/Foo/,/^}/s%^}%\t//New insert\n}%' file

在一天结束时,您总能找到一些与您的解决方案不相符的内容,因此您可能需要了解您的数据:)

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

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

答案 3 :(得分:0)

这可以在RedHat上完成GNU Sed 4.2.2的工作(如果你愿意,你可以测试它here

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

我假设文件可以包含更多类,并且我尝试在文件中间的类Foo2结束之前插入我的文本(在此处插入)。

测试:

$ 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 {}
}

说明:
/class Foo2 {//^}$/ - 范围 - 从class name Foo2 {到第一个^}$
{s/^}$/Insert here\n\0/} - 替换部分。将^}$替换为your textnew line加上替换的部分\0
;p:打印

更新BSD
在@ghoti的精彩帮助下,在设置FreeBSD机器进行测试后,这似乎适用于FreeBSD(仅限bash):

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

请注意,如果shell不是bash,这将无效。无论如何你可以尝试一下。