【问题标题】:Handle new line with sed in Unix在 Unix 中使用 sed 处理新行
【发布时间】:2017-02-25 06:58:29
【问题描述】:

我正在将Testng 断言转换为AssertJ 我正在使用sed 命令。当有带有新行的语句时,我会被绞死,

Exa 1:

assertEquals(person.getAddressLine1(),
        "This is long line, so needs to go in second line as per Formatter.........!!!!!!!"); 

Exa 2:

assertEquals(person.getAddressLine1(),
             "This is very long line, so needs to break down in multiple" +
                     "This is very long line, so needs to break down in multiple" +
                     "This is very long line, so needs to break down in multiple");

我当前的解决方案:这非常适合单行断言。

sed -i 's/assertEquals([[:blank:]]*\(.\+\),[[:blank:]]*\(["].\+["]\+\))[[:blank:]]*;/Assertions.assertThat(\1).isEqualTo(\2);/g'

注意:我知道,我可以在编辑器 Formatterr 中更改行的最大长度,但不知何故我无法更改它,因为那时我需要执行 Ctrl + Shift + F 再次,这对我来说是不可能的。

更新:下面给出了两个示例的预期输出。

Exa 1:

Assertions.assertThat(person.getAddressLine1()).isEqualTo("This is long line, so needs to go in second line as per Formatter.........!!!!!!!");

Exa 2:

Assertions.assertThat(person.getAddressLine1()).isEqualTo("This is very long line, so needs to break down in multiple" +
        "This is very long line, so needs to break down in multiple" +
        "This is very long line, so needs to break down in multiple");

【问题讨论】:

  • 您是否愿意接受由sed 将多行断言转换为单行语句的解决方案?
  • 当您在断言中使用逗号和双引号时,任何基于正则表达式的解决方案都会遇到错误,例如assertEquals("a \"quoted\" value, foo, bar", str);
  • @Leon:是的....
  • @anubhava :这是可以接受的,这就是为什么我没有在这里给出这个例子。
  • 我愿意接受任何适用于上述场景的解决方案(第二个参数的行数可能会有所不同)。

标签: regex string bash unix sed


【解决方案1】:

感谢大家的支持,我终于可以按照我的要求使用sed了。

sed -i ':a;N;$!ba;s/[[:blank:]]*assertEquals(\([^;]\+\),\(\n[[:blank:]]*\([^;]\+\(\n\)*\)\))[[:blank:]]*;/    Assertions.assertThat(\1).isEqualTo(\2);/g' '{}' \;

【讨论】:

    【解决方案2】:

    assertEquals 的第一个参数完全在第一行并且不包含逗号时,这是您想要的简单近似:

    sed -i 's/assertEquals(\s*\([^,]\+\),/Assertions.assertThat(\1).isEqualTo(/g'
    

    【讨论】:

      【解决方案3】:

      sed 可能会这样做,但由于存在换行符,命令会更加复杂。这是一个更简单的perl 命令,它使用 slurp 模式来做同样的事情:

      perl -00 -pe 's/\bassertEquals\(\s*([^,]+),\s*([^)]+)\)\s*;/Assertions.assertThat($1).isEqualTo($2);/' file
      

      RegEx Demo


      使用sed 你可以这样做:

      sed -i -E ':a;N;s/\n[ \t]*//g;s/;/;\n/;s/assertEquals\([[:blank:]]*([^,]+),[[:blank:]]*([^)]+)\)[[:blank:]]*;/Assertions.assertThat(\1).isEqualTo(\2);/;ba' file
      

      【讨论】:

      • 感谢@anubhava,但实际上我需要 sed。
      • 感谢@anubhava,但您可能错过了在您尝试使用sed之前我已经回答了自己
      • 啊刚刚意识到。最后你有额外的'{}' \;(可能来自find命令的-exec选项)
      • 我在您的 sed 中看到的另一个问题是它不适用于单行 assertEquals 例如assertEquals(person.getAddressLine1(), "This is long line, so needs to go in second line as per Formatter.........!!!!!!!");
      【解决方案4】:

      如果您可以访问awk,也可以这样做

      脚本

      awk '$0 ~ /assertEquals\(person.getAddressLine1\(\),/{
      printf "Assertions.assertThat(person.getAddressLine1()).isEqualTo(";
      getline;
      gsub(/^[[:blank:]]*"/,"\"")}1' filename
      

      样本输出

      Assertions.assertThat(person.getAddressLine1()).isEqualTo("This is very long line, so needs to break down in multiple" +
              "This is very long line, so needs to break down in multiple" +
              "This is very long line, so needs to break down in multiple");
      

      【讨论】:

        猜你喜欢
        • 2015-07-11
        • 2011-04-07
        • 1970-01-01
        • 2013-08-25
        • 2021-07-19
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-01-18
        相关资源
        最近更新 更多