Bash 在Ubuntu上查找并删除DOS行尾
我发现我的许多文件都有DOS行尾。在VI中,它们看起来像这样:“^M”。 我不想修改没有这些DOS行结尾的文件。如何使用bash脚本实现这一点?谢谢Bash 在Ubuntu上查找并删除DOS行尾,bash,unix,sed,awk,grep,Bash,Unix,Sed,Awk,Grep,我发现我的许多文件都有DOS行尾。在VI中,它们看起来像这样:“^M”。 我不想修改没有这些DOS行结尾的文件。如何使用bash脚本实现这一点?谢谢 EV您可以使用以下命令: dos2ux file.in>file.out or: 在perl中: perl -pi -e 's/\r//g' your_file 或者,您可以执行以下操作: 在vi中打开 转到命令模式 键入:%s/[ctrl-V][ctrl-M]//g 有很多选择。您可以尝试其中任何一种 注意,如果要转换多字节文件
EV您可以使用以下命令:
dos2ux file.in>file.out or:
在perl中:
perl -pi -e 's/\r//g' your_file
或者,您可以执行以下操作:
- 在vi中打开
- 转到命令模式
- 键入
:%s/[ctrl-V][ctrl-M]//g
flip
程序在Debian中也称为flip
,可以处理行结束。从手册中:
当要求将文件转换为其已存在的格式时
具有,翻转不会导致文件更改。因此,要将所有
将文件转换为您可以键入的**IX格式
翻转u*
所有文件最终都会正确无误,不管它们是否正确
以MS-DOS或**IX格式开始。这也适用于
相反的方向。
或者您可以使用GNU重新编码:
< /etc/passwd recode ..pc | tee a b > /dev/null
file a b
转换为unix行结尾:
recode pc.. a b
file a b
输出:
a: ASCII text, with CRLF line terminators
b: ASCII text, with CRLF line terminators
a: ASCII text
b: ASCII text
recode将dos行尾缩写为
pc
,因此pc..
的逻辑是:从pc格式转换为默认格式,即带有unix行尾的拉丁文1。在ubuntu上,使用fromdos
实用程序
fromdos test.txt
上面的示例将以MS-DOS或Microsoft Windows文件或具有不同行分隔符的其他文件为例,并使用新的行分隔符格式化该文件,以便在Linux和Unix中读取
grep将为您提供当前目录下具有DOS行结尾的所有文件的列表
<代码> -U/COD>使GRIP考虑行结束,而不是在缺省值
中删除它们。-R
使其递归
-l
使其仅列出文件名,而不列出匹配行
然后将该列表导入converter命令(在ubuntu上是fromdos
,dos2unix
我来自哪里)
注意:实际上不要键入
^M
。相反,您需要先按
,然后按
,插入^M
字符,让grep明白您的目的。或者,您可以键入$'\r'
来代替^M
(但我认为这可能只适用于bash…。使用GNU coreutils
的单向方式:
< file.txt tr -d '\r'
如果需要按文件结尾进行筛选,则对中奖答案进行修改grep -URl ^M . | grep .php | xargs dos2unix
我使用dos2unix而不是fromdos,但是效果应该是一样的
cat origin_file.txt | sed "s/^M//" > dest_file.txt
你必须做上面提到的同样的事情,ctl-V然后ctl-M来获得那个角色。这对我来说更可取,因为它可以跨多个平台移植,并且在bash中保持简单
在ubuntu上,我也发现这样做很有效:
cat origin_file.txt | sed“s/\r/>dest_file.txtgrep-URl^M.|xargs fromdos?用于安装的Ubuntu包称为“tofrodos”。在tcsh上,也可能在csh上,您可以通过
grep-URl“\r”获得相同的效果xargs fromdos
。如果您需要它来处理名称中带有空格的文件,请尝试grep-URl^M。|而是xargs-I{}dos2unix“{}”
。
cat origin_file.txt | sed "s/^M//" > dest_file.txt