使用基于模式的sed删除文件行中间的CRLF

时间:2017-07-11 15:33:32

标签: linux sed

我有一个java文件,其中我在 Logger 末尾有CRLF以下的行。

private static final Logger logger = LoggerCRLF
        .getLogger(MyClass.class);

我想要做的是在我的文件中的 Logger 之后删除CRLF并将该行连接成一行,如下所示。这不应该影响我文件中的其他CRLF。

private static final Logger logger = Logger.getLogger(MyClass.class);

我尝试了以下命令来执行此操作

find . -name *.java -exec sed -i 's/Logger\r\n//g' {} \;

但是我意识到SED一次读取一行而没有尾随换行符,所以这不起作用。在 man 页面中,我能够找到一些命令,例如 N P D ,但我不能让它发挥作用。

所以问题是如何根据文件中的前一个模式删除一个CRLF?

3 个答案:

答案 0 :(得分:2)

$ cat -A ip.txt 
private static final Logger logger = Logger^M$
        .getLogger(MyClass.class);$
$ sed '/Logger\r$/{N;s/\r\n[[:blank:]]*//}' ip.txt | cat -A
private static final Logger logger = Logger.getLogger(MyClass.class);$
  • /Logger\r$/如果符合此正则表达式
    • N在模式空间中添加下一行
    • s/\r\n[[:blank:]]*//删除CRLF后跟可选空格
  • 如果有LoggerCRLF
  • 的连续行,则无效
  • 使用GNU sed 4.2.2语法进行测试可能会因其他实现而异[/ li>

答案 1 :(得分:0)

是的,你可能已经意识到要对sed,#34; line"的定义。是以换行符结尾的内容,因此您真正处理要加入的多行。

您可以使用" tr"来连接线条。 (translate)命令是否可用: How to concatenate multiple lines of output to one line?

答案 2 :(得分:0)

sed '/Logger\r/N;s/\r\s*//' FILE