从Unix中的文件中删除所有回车符\r
的最简单方法是什么?
答案 0 :(得分:240)
我假设你的意思是在行的结束处的回车( CR ,"\r"
,0x0d
)而不仅仅是盲目地在一个文件中(你可能将它们放在字符串的中间,我所知道的)。仅在第一行末尾使用带有 CR 的测试文件:
$ cat infile
hello
goodbye
$ cat infile | od -c
0000000 h e l l o \r \n g o o d b y e \n
0000017
dos2unix
是你的系统上安装的方法:
$ cat infile | dos2unix -U | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
如果由于某些原因dos2unix
无法使用,那么sed
会执行此操作:
$ cat infile | sed 's/\r$//' | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
如果由于某些原因sed
无法使用,那么ed
会以复杂的方式执行此操作:
$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
如果您的盒子上没有安装任何这些工具,那么您遇到的问题比尝试转换文件要大: - )
答案 1 :(得分:213)
tr -d '\r' < infile > outfile
请参阅tr(1)
答案 2 :(得分:36)
旧学校:
tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
答案 3 :(得分:27)
在许多系统上都存在一个名为dos2unix的实用程序,并且可以在大多数系统上轻松安装。
答案 4 :(得分:21)
在我看来,最简单的Linux方式是
var array=[
{Key:"Name",Value:"Sam" },
{Key:"Marks",Value:"50"},
{Key:"Subject",Value:"English"},
];
var i=0;
var value;
for(array as value) {
value[i]=$(this).text();
i++;
alert(value[i]);
}
替换运算符sed -i 's/\r$//g' <filename>
周围的强引号是必需。如果没有它们,shell会将's/\r//'
解释为escape + r并将其缩小为普通\r
,并删除所有小写r
。这就是为什么Rob在2009年上面给出的答案不起作用的原因。
添加r
修饰符可确保删除多个/g
,而不仅仅是第一个。
答案 5 :(得分:7)
sed -i s/\r// <filename>
或某些人;请参阅man sed
或网上提供的有关sed
使用的丰富信息。
有一点需要指出的是上述“回车”的确切含义;如果你真的是指单个控制字符“回车”,那么上面的模式是正确的。如果你的意思更一般地说是CRLF(回车和换行,这是在Windows下实现换行的方式),那么你可能想要替换\r\n
。 Linux / Unix中的裸线提要(换行符)为\n
。
答案 6 :(得分:6)
如果您是Vi用户,则可以打开文件并删除回车符:
:%s/\r//g
或
:1,$ s/^M//
请注意,您应按ctrl-v然后按ctrl-m键入^ M.
答案 7 :(得分:6)
再一次解决方案......因为总有一个解决方案:
perl -i -pe 's/\r//' filename
这很好,因为它已经到位并适用于我曾经使用的各种unix / linux。
答案 8 :(得分:3)
其他人推荐dos2unix
,我也强烈推荐它。我只是提供更多细节。
如果已安装,请跳至下一步。如果尚未安装,我建议通过yum
安装,如:
yum install dos2unix
然后你就可以使用它:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
答案 9 :(得分:2)
这就是事情,
dos2unix fileName.extension fileName.extension
是回车符。使其与Unix兼容。我们需要使用以下命令。
A
答案 10 :(得分:1)
如果您使用的操作系统(如OS X)没有dos2unix
命令但有Python解释器(版本2.5+),则此命令等同于dos2unix
命令:
python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"
它处理命令行上的命名文件以及管道和重定向,就像dos2unix
一样。如果将此行添加到〜/ .bashrc文件(或其他shell的等效配置文件)中:
alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""
...下次登录时(或在当前会话中运行source ~/.bashrc
),您将能够以与在其他方式相同的方式在命令行上使用dos2unix
名称实例
答案 11 :(得分:1)
尝试将dos文件转换为unix文件:
fromdos文件
答案 12 :(得分:1)
对于UNIX ...我注意到dos2unix从我的UTF-8文件中删除了Unicode标头。在git bash(Windows)下,以下脚本似乎运行良好。它使用sed。请注意,它仅删除行末尾的回车符,并保留Unicode标题。
#!/bin/bash
inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"
答案 13 :(得分:1)
如果您正在运行X环境并拥有适当的编辑器(visual studio代码),那么我会遵循推荐:
Visual Studio Code: How to show line endings
只需转到屏幕的右下角,visual studio代码就会显示文件编码和文件后面的行尾约定,只需点击一下即可切换它。
在Linux环境中使用可视代码作为notepad ++的替代品,你就可以了。
答案 14 :(得分:0)
我已经使用了python,这里是我的代码;
var has_clicked = false;
$(document).ready(function(){
$(".navbar-toggle").click(function() {
if(!has_clicked){
setTimeout(function () {
has_clicked = true;
$(".navbar-toggle").click();
}, 4500);
}
});
});
答案 15 :(得分:0)
尽管帖子比较老,但最近我遇到了同样的问题。由于我在/ tmp / blah_dir /中拥有所有要重命名的文件,因为此目录中的每个文件都带有“ / r”结尾字符(文件末尾显示“?”),所以我只能想到脚本方式。
我想用相同的名称保存最终文件(不带任何字符)。 使用sed时,问题在于输出文件名,我需要提到其他东西(我不想要)。
我尝试了此处建议的其他选项(由于某些限制,不考虑使用dos2unix),但是没有用。
我最终尝试了“ awk”,该方法在我使用“ \ r”作为分隔符并采用第一部分的情况下起作用:
技巧是:
echo ${filename}|awk -F"\r" '{print $1}'
下面我使用的脚本片段(在路径/ tmp / blah_dir /下,我所有文件的末尾都有“ \ r”作为后缀)
cd /tmp/blah_dir/
for i in `ls`
do
mv $i $(echo $i | awk -F"\r" '{print $1}')
done
注意:这个示例虽然与我的工作非常接近,但并不十分精确(此处提及的目的只是为了更好地说明我的工作)
答案 16 :(得分:0)
\r
:该问题中大多数现有的解决方案都是特定于GNU的,并且不适用于OS X或BSD;下面的解决方案应该可以在更多的UNIX系统上使用,并且可以在tcsh
到sh
的任何shell中使用,甚至在GNU / Linux上也可以使用。
在tcsh
的OS X,OpenBSD和NetBSD上进行了测试,在bash
的Debian GNU / Linux上进行了测试。
sed
:在OS X的tcsh
中,以下sed
代码段可以与printf
一起使用,因为sed
和echo
都不能处理{{1 }}就像GNU一样:
\r
sed `printf 's/\r$//g'` input > output
:另一个选项是tr
:
tr
tr -d '\r' < input > output
与sed
之间的区别:看来tr
保留了输入文件中没有尾随换行符,而tr
在OS X和NetBSD(而不是在OpenBSD或GNU / Linux上)上插入了尾随换行符即使输入在文件的末尾缺少任何结尾的sed
或\r
,文件的末尾也是如此。
这里有一些示例测试,可以使用\n
和hexdump -C
来确保它在您的系统上有效;或者,如果您的系统缺少printf
,也可以使用od -c
:
hexdump
答案 17 :(得分:0)
我制作了这个shell脚本来删除\ r字符。它可以在solaris和red-hat中使用:
#!/bin/ksh
LOCALPATH=/Any_PATH
for File in `ls ${LOCALPATH}`
do
ARCACT=${LOCALPATH}/${File}
od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
rm ${ARCACT}.TMP
done
exit 0
答案 18 :(得分:0)
cat input.csv | sed's / \ r / \ n / g'> output.csv
为我工作
答案 19 :(得分:0)
使用sed
sed $'s/\r//' infile > outfile
在Windows的Git Bash上使用sed
sed '' infile > outfile
第一个版本使用 ANSI-C引号,如果命令从脚本运行,则可能需要转义\
。第二个版本利用sed
通过删除\r
和\n
字符逐行读取输入文件这一事实。但是,将行写入输出文件时,它仅附加一个\n
字符。只需修改IFS
IFS=$'\r\n' # or IFS+=$'\r' if the lines do not contain whitespace
printf "%s\n" $(cat infile) > outfile
IFS=$' \t\n' # not necessary if IFS+=$'\r' is used
警告::此解决方案执行文件名扩展(*
,?
,[...]
以及设置extglob
时的更多扩展名)。仅在确定文件不包含特殊字符或要扩展时使用它。
警告:所有解决方案都无法处理输入文件中的\
。
答案 20 :(得分:-1)
你可以这样做:
$ echo $(cat input) > output