【问题标题】:Search and Append with new line Linux使用新行 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()

标签: regex awk replace sed find


【解决方案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]*)' 获得缩进,
      • 在插入的装饰器之前应用缩进,也在原行之前应用缩进。

      【讨论】:

        猜你喜欢
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        • 2016-06-21
        • 2018-06-18
        • 1970-01-01
        相关资源
        最近更新 更多