【问题标题】:Sed not replacing new line pattern in text file [duplicate]Sed不替换文本文件中的新行模式[重复]
【发布时间】:2019-10-01 15:21:29
【问题描述】:

我有一个从 SQL Server 管理器中检索到的 txt 文件,因此行分隔符是 '\r\n'。我想将此行分隔符更改为'\n'。你可以在下面看到我的方法。问题是即使在运行 sed 之后,看起来 '\r\n' 也没有被替换,如下所示。我在这里错过了什么?

>>> grep \r\n some_file.txt |wc -l
21321

>>>sed -i 's/\r\n/\n/g' some_file.txt
>>> grep \r\n some_file.txt |wc -l
21321

我正在使用:

sed (GNU sed) 4.4

在 Linux 4.15 Ubuntu 上

【问题讨论】:

  • 只需使用sed -i 's/\r//g' some_file.txt,因为 sed 以每行为基础进行操作。
  • 提供一点见解:sed 在脚本执行期间从文件输入中删除标准的\n 行终止,并将其重新附加到输出中。在这两者之间,它只在其模式空间中保存…\r,这就是为什么你永远不能在行尾匹配\r\n——没有\n。您需要在行尾匹配单个 \r 并将其替换为空字符串。
  • 要扩展 Robin479 的注释,可以将行尾与 $ 字符匹配,因此 \r$ 。祝你好运。
  • 想一想,我不认为 sed honnors \r, \n 之类的“符号”,您需要指定 Ctrl Char 版本,因为各种历史约束,\r=^M,而\n=^J。如果您使用基于vi 的命令行编辑器,则需要使用^V 转义这些字符,因此,我认为您真的想要sed 's/^V^M$//' file(注意不需要g)。这意味着按住Ctrl键,按v,按住Ctrl键,按m。您不会看到^V 出现在命令行上。 .....
  • 当然,假设您只想将DOS 文件转换为UNIX 格式,您的系统可能有专门为此目的而构建的实用程序dos2unx file [files....n]。或者,如果您使用的是原始系统,希望您可以使用tr -d '\013' file > file.tmp && mv file.tmp file。如果这些都没有帮助,请提供uname -srvsed --version 的输出。事实上,作为一个新手,最好将它作为您发布的所有问题的第一个信息。祝你好运!

标签: bash sed grep wc findandmodify


【解决方案1】:

试试这个:

sed -i 's/\r//' some_file.txt

【讨论】:

  • 做到了,但是 grep 仍然显示同样多的情况,所以它仍然没有工作
猜你喜欢
  • 2013-11-01
  • 2019-02-15
  • 2020-03-01
  • 2017-06-06
  • 2020-01-19
  • 2021-11-27
  • 2013-06-26
  • 2013-06-20
  • 2016-07-26
相关资源
最近更新 更多