使用sed从文件中删除^M个字符

使用sed从文件中删除^M个字符,sed,awk,Sed,Awk,我在一个文件中有一行: ULNET-PA,client_sgcib,broker_keplersecurities ,KEPLER 我试图摆脱^M(回车)字符,因此我使用: sed 's/^M//g' 但是,这会删除^M之后的所有内容: [root@localhost tmp]# vi test ULNET-PA,client_sgcib,broker_keplersecurities^M,KEPLER [root@localhost tmp]# sed 's/^M//g' test UL

我在一个文件中有一行:

ULNET-PA,client_sgcib,broker_keplersecurities
,KEPLER
我试图摆脱^M(回车)字符,因此我使用:

sed 's/^M//g'
但是,这会删除^M之后的所有内容:

[root@localhost tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities^M,KEPLER

[root@localhost tmp]# sed 's/^M//g' test
ULNET-PA,client_sgcib,broker_keplersecurities
我想得到的是:

[root@localhost tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities,KEPLER
使用
tr

tr -d '^M' < inputfile
使用
tr

tr -d '^M' < inputfile
还是那句话:

sed -i 's/^M//g' file
键入命令时,对于
^M
键入Ctrl+VCtrl+M

实际上,如果您已经在vim中打开了该文件,您可以在vim中执行以下操作:

:%s/^M//g
相同,
^M
您键入的
Ctrl-V Ctrl-M

仍然是同一行:

sed -i 's/^M//g' file
alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' "
键入命令时,对于
^M
键入Ctrl+VCtrl+M

实际上,如果您已经在vim中打开了该文件,您可以在vim中执行以下操作:

:%s/^M//g
相同,
^M
您键入的
Ctrl-V Ctrl-M

alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' "
用法:

dos2unix file
用法:

dos2unix file
我同意(见上文),Mac OSX上的dos2unix涵盖了这一点,引用了
man dos2unix

要在Mac模式下运行,请使用命令行选项“-cmac”或使用 命令“mac2unix”或“unix2mac”

我选择了“mac2unix”,它去掉了我不太显眼的“^M”条目,这是由苹果公司在2台约塞米蒂(OSX 10.10)Mac电脑之间的bash脚本“消息”传输引入的

我使用流行的软件包安装程序在Mac OSX上安装了“dos2unix”,我强烈推荐它及其配套命令。

我同意(见上文),Mac OSX上的dos2unix涵盖了这一点,引用了
man dos2unix

要在Mac模式下运行,请使用命令行选项“-cmac”或使用 命令“mac2unix”或“unix2mac”

我选择了“mac2unix”,它去掉了我不太显眼的“^M”条目,这是由苹果公司在2台约塞米蒂(OSX 10.10)Mac电脑之间的bash脚本“消息”传输引入的


我使用流行的软件包安装程序在Mac OSX上安装了“dos2unix”,我强烈推荐它及其配套命令。

您只需使用大多数Unix/Linux系统中可用的dos2unix即可。但是,我发现以下sed命令更好,因为它删除了dos2unix无法删除的^M:

sed 's/\r//g' < input.txt >  output.txt
sed's/\r//g'output.txt
希望有帮助

注意:^M实际上是回车符,在代码中表示为\r\n dos2unix的功能很可能相当于:

sed 's/\r\n/\n/g' < input.txt >  output.txt
sed's/\r\n/\n/g'output.txt

如果后面没有紧跟\r\n,则不会删除,并将两者替换为\r\n。对于某些类型的文件,例如我刚刚测试过的文件,这是失败的。

您可以简单地使用dos2unix,它在大多数Unix/Linux系统中都可用。但是,我发现以下sed命令更好,因为它删除了dos2unix无法删除的^M:

sed 's/\r//g' < input.txt >  output.txt
sed's/\r//g'output.txt
希望有帮助

注意:^M实际上是回车符,在代码中表示为\r\n dos2unix的功能很可能相当于:

sed 's/\r\n/\n/g' < input.txt >  output.txt
sed's/\r\n/\n/g'output.txt
如果后面没有紧跟\r\n,则不会删除,并将两者替换为\r\n。对于某些类型的文件,例如我刚刚测试过的文件,这会失败。

如果Perl是一个选项:

perl-i-pe的/\r\n$/\n/g'文件

-i
生成输入文件的.bak版本
\r
=回车
\n
=linefeed
$
=行尾
s/foo/bar/g
=如果Perl是一个选项,则将“foo”全局替换为“bar”

perl-i-pe的/\r\n$/\n/g'文件

-i
生成输入文件的.bak版本
\r
=回车
\n
=linefeed
$
=行尾
s/foo/bar/g
=在awk中用“bar”替换“foo”:

sub(/\r/,"")
如果在记录末尾,
sub(/\r/,“”,$NF)
就足够了。无需扫描整个记录。

在awk中:

sub(/\r/,"")

如果在记录末尾,
sub(/\r/,“”,$NF)
就足够了。无需扫描整个记录。

这是一个干净、简单的方法,它可以工作:

sed -i 's/\r//g' file

其中
\r
当然等同于
^M

这既干净又简单,而且有效:

sed -i 's/\r//g' file

当然,
\r
^M

是等价的,这是实现

tr -d '\015' < inputfile_name > outputfile_name
tr-d'\015'outputfile\u name

稍后将文件重命名为原始文件名。

这是更好的实现方法

tr -d '\015' < inputfile_name > outputfile_name
tr-d'\015'outputfile\u name

稍后将文件重命名为原始文件名。

+1是最简单的解决方案。还请注意,您可以在tr中使用八进制代码,例如
tr-d'\012'
来删除换行符。您可以使用
od-bc inputfile
浏览代码的含义以及文件中的位置。@twalberg I gues
dos2unix
只会从行尾删除CR。问题中的示例没有说明它是否仅出现在行的末尾。@devnull我想它可能不是通用的,但是我的
dos2unix
有几个不同的选项来控制转换模式,这可能是合适的(特别是那些处理Mac文件的文件,它们似乎喜欢使用
^M
行结尾)。这可能不是解决当前问题的完美方法,但了解它是件好事,因此“请参见…”。如果您使用的是bash,您可以编写
tr-d$'\r'
@twalberg=>是的,可以让dos2unix在Mac上执行此操作,请参阅下面的my.+1以获得最简单的解决方案。还请注意,您可以在tr中使用八进制代码,例如
tr-d'\012'
来删除换行符。您还可以使用
od-bc inputfile
来浏览代码的含义文件中的at和are where。@twalberg I gues
dos2unix
只会从行尾删除CR。问题中的示例无法说明它是否只在行尾出现。@devnull我想可能不是