【问题标题】:Remove only LF in txt file仅删除 txt 文件中的 LF
【发布时间】:2012-11-21 09:46:26
【问题描述】:

我只需要删除LF,而不是CRLF。有什么想法吗?

我可以使用 PHP、notepad++、shell 脚本等

【问题讨论】:

  • 您需要删除LF,还是用CRLF替换它?
  • 全部 LF 还是只有一个之前没有 CR 的?
  • @stema 我需要删除所有没有 CR 的 LF。只有这种情况。

标签: php regex text notepad++


【解决方案1】:

在记事本++中

试试这个:(?<!\r)\n

请务必在搜索选项中设置正则表达式选项,希望对您有所帮助

【讨论】:

  • 为我工作。奇怪的是,将其反转为 \r(?<!\n) 并没有让我找到只有 CR 而不是 LF...但我随后尝试了这种确实有效的变体:\r^
  • 或者这个似乎也可以找到单独的 CR:\r[^\n]+。这个可能会更好,因为它不依赖于“line-end”,这对于单独的 CR 来说是模糊的......
【解决方案2】:

使用消极的向后看。

$str = preg_replace("#(?<!\r)\n#", '', $str);

Fiddle

【讨论】:

    【解决方案3】:

    在 Notepad++ 中,您使用搜索/替换、勾选扩展(左下方)和替换

    \n
    

    什么都没有。

    【讨论】:

    • \n 只影响 LF,\r 会影响 CR。 \r\n 会影响 CRLF ;)。但是,是的,它也会影响 CRLR 中的 LR。
    • 我认为这不会像我需要的那样工作。如果我搜索 \n 也会在 CRLF 中找到 LF。
    【解决方案4】:

    LF 代表换行符,它是 ASCII 10 或 0x0A 或 "\n"(在 PHP 中)。所以就去做吧

    search_replace( "\n", '', $text)

    请注意 CRLF 实际上是两个字符 CR(回车)+ LF。如果您删除 LF,您的文本中仍会包含 CR(如果有)。

    编辑

    如果您只想删除独立的 LF,但保留 CRLF,那么上面的代码是错误的,因为它会将 CRLF 转换为 CR。使用preg_replace() 来做到这一点

    preg_replace("/(?<!\\r)\\n+(?!\\r)/", '', $text);
    

    如果出于任何原因您不想使用preg_replace()(但无论如何都要使用它),那么您可以尝试这种愚蠢的方法:

    // save CRLFs by replacing with some text that does 
    $tmp = str_replace("\r\n", 'S0m3L1k3LyUn1Qu3T3X7', $text);
    
    // get rid of LFs
    $tmp = str_replace("\n", '', $tmp );
    
    // restore CRLFs
    $text = str_replace('S0m3L1k3LyUn1Qu3T3X7', "\r\n", $tmp);
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多