Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在Ubuntu上查找并删除DOS行尾_Bash_Unix_Sed_Awk_Grep - Fatal编程技术网

Bash 在Ubuntu上查找并删除DOS行尾

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 有很多选择。您可以尝试其中任何一种 注意,如果要转换多字节文件

我发现我的许多文件都有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

有很多选择。您可以尝试其中任何一种

注意,如果要转换多字节文件,您需要格外小心,可能应该尝试使用正确的iconv或从编码规范中重新编码

如果它是一个普通的ASCII文件,下面两种方法都可以

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.txt

grep-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