【问题标题】:Removing CRLF in the middle of a line of a file using sed based on a pattern使用基于模式的 sed 删除文件行中间的 CRLF
【发布时间】:2017-12-15 18:31:46
【问题描述】:

我有一个 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?

【问题讨论】:

  • this answer 呢?
  • @cxw,我的问题是关于 SED 命令而不是 TR 或 VIM 文本编辑器。在您的示例中 -d 的 Tr 将删除所有标记
  • @Vahid 您可以添加预期的输出以清楚起见吗? (例如:如果您还想删除下一行中的空白)....另外,您可以有两行以Logger\r\n 结尾的连续行吗?我想这就是你要找的东西:sed '/Logger\r/{N;s/\r\n[[:blank:]]*//}'
  • @Vahid 我正在查看该答案底部的sed 命令。

标签: linux sed


【解决方案1】:

是的,您可能已经意识到,对于 sed,“行”的定义是以换行符结尾的东西,因此您实际上是在处理要加入的多行。

如果可用,您可以使用“tr”(翻译)命令连接行: How to concatenate multiple lines of output to one line?

【讨论】:

    【解决方案2】:
    sed '/Logger\r/N;s/\r\s*//' FILE
    

    【讨论】:

      【解决方案3】:
      $ 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 进行测试,语法可能因其他实现而异

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2023-03-21
        • 2015-03-02
        • 2022-12-10
        • 1970-01-01
        相关资源
        最近更新 更多