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

标签 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 页面中,我能够找到一些命令,例如 NPD,但我找不到让它发挥作用。

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

最佳答案

$ 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 语法进行测试,可能因其他实现而异

关于linux - 使用 sed 基于模式删除文件行中间的 CRLF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038882/

相关文章:

mysql - 仅在Workbench上无法访问(6.3.6 Build 517 CE(64位)社区)

linux - 虚拟机 apt-get grub 问题

linux - tsv 文件两列的并集

linux - 在使用 SED 命令添加之前检查文件中是否存在新行

linux - 使用 GNU sed 和 GNU find 时如何加速替换?

linux - 如何将 sed 与需要转义的变量一起使用

linux - 如果按字母顺序排列,使用 Sed 只删除文件名中的第一个字符

python fabric run 命令将错误作为标准输出返回

c++ - 尝试使用线程运行 CamShift

sed - 需要解析如下sed命令 : sed -e 's//\' $'\n/g'