使用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 guesdos2unix
只会从行尾删除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 guesdos2unix
只会从行尾删除CR。问题中的示例无法说明它是否只在行尾出现。@devnull我想可能不是