【发布时间】: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$。祝你好运。 -
想一想,我不认为
sedhonnors\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 -srv和sed --version的输出。事实上,作为一个新手,最好将它作为您发布的所有问题的第一个信息。祝你好运!
标签: bash sed grep wc findandmodify