使用新行 Linux 搜索和追加

Posted

技术标签:

【中文标题】使用新行 Linux 搜索和追加【英文标题】:Search and Append with new line Linux 【发布时间】:2017-04-14 23:20:12 【问题描述】:
        protected void setUp() throws Exception
        

              //...
        

我想为所有类中的每个方法添加@Before。我有近 500 多个课程。如果我手动操作会非常困难。

        @Before
        protected void setUp() throws Exception
        

              //...
        

我试过了

sed -i "s/protected void setUp()/@Before()\nprotected void setUp()/g" File

但如果我这样做,对齐方式就会改变。

    @Before()
protected void setUp() throws Exception
    

    

请帮帮我。我想有正确的对齐方式

【问题讨论】:

什么是常数部分? protected void? 受保护的 void setUp() 【参考方案1】:

使用 GNU awk,您可以使用 gensub() 捕获 protected void setUp() 前面的空格数并将它们打印在所需文本的前面:

$ awk '$0=gensub(/^(\s*)(protected void setUp)/, "\\1@Before\n&", 1)1' file
        @Before
        protected void setUp() throws Exception
        
              //...
        

看看它是如何工作的:

$0=gensub() 执行更改并将当前记录设置为此值。 gensub(/^(\s*)(protected void setUp)/, "\\1@Before\n&", 1) 这将查找开头带有一些空格的字符串 protected void setUp 并捕获两者。然后,它用那些空格 + "@Before" 替换它,然后是新行和原始行。 1 它触发 awk 的默认操作,与打印当前(更新的)行一致。

请注意,这只会检查到 protected void setUp。如果你还想检查setUp后面的括号,说:/^(\s*)(protected void setUp\(\))/(需要转义括号,因为普通的有捕获组的功能)。

这考虑到捕获的组可以通过说\\nn 其序数或& 来表示完整字符串。


通过更极端的示例文件查看它的实际效果:

 $ cat a
        protected void setUp() throws Exception
        

              //...
        

blablablabla
 protected void setUp() throws Exception

and this is
               protected void setUp() throws Exception

变成:

$ awk '$0=gensub(/^(\s*)(protected void setUp)/, "\\1@Before\n&", 1)1' a
        @Before
        protected void setUp() throws Exception
        

              //...
        

blablablabla
 @Before
 protected void setUp() throws Exception

and this is
               @Before
               protected void setUp() throws Exception

【讨论】:

【参考方案2】:

sed 用于在单个行上进行简单替换,仅此而已。这不是你想要做的,所以这不是 sed 的工作,而是 awk 的工作。这适用于任何 awk:

$ awk 's=$0 sub(/protected void setUp().*/,"@Before",s)print s 1' file
        @Before
        protected void setUp() throws Exception
        

              //...
        

借用@fedorqui 更全面的示例输入文件:

$ cat a
        protected void setUp() throws Exception
        

              //...
        

blablablabla
 protected void setUp() throws Exception

and this is
               protected void setUp() throws Exception

$ awk 's=$0 sub(/protected void setUp().*/,"@Before",s)print s 1' a
        @Before
        protected void setUp() throws Exception
        

              //...
        

blablablabla
 @Before
 protected void setUp() throws Exception

and this is
               @Before
               protected void setUp() throws Exception

【讨论】:

【参考方案3】:

我认为sed 的这个简单任务没有错:

sed -r -i -e "s/^([ \t]*)(protected void setUp())/\1@Before()\n\1\2/g" File
记得在sed中添加-r参数来激活正则表达式语法, 使用 `^([ \t]*)' 获得缩进, 在插入的装饰器之前应用缩进,也在原行之前应用缩进。

【讨论】:

以上是关于使用新行 Linux 搜索和追加的主要内容,如果未能解决你的问题,请参考以下文章

Big Query 追加新行

pandas - 追加具有不同列数的新行

将新行追加到 cronjob 的输出日志

在我追加新行后,select2 不起作用

如果不存在,则创建一个 .txt 文件,如果它确实追加一个新行

在追加模式下使用 to_csv 时,python pandas 新行附加到 csv 中的最后一行