\r
在Unix中从文件中删除所有回车符的最简单方法是什么?
\r
在Unix中从文件中删除所有回车符的最简单方法是什么?
Answers:
我会假设你的意思回车(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
如果您的包装盒中未安装任何这些工具,那么与尝试转换文件相比,您遇到的问题更大:-)
\r
仅适用于GNU sed,否则您可以执行以下操作:sed `echo "s/\r//"`
sed
既不echo
承认也不认可\r
。在这种情况下,只能printf "\r"
正常工作。
sed "s/$(printf '\r')\$//"
$
sed $'s@\r@@g' |od -c
\n
tr -d '\r' < infile > outfile
参见tr(1)
tr
不支持\r
转义符,请尝试输入'\015'
一个文字'^M'
(在许多终端上的许多shell中,ctrl-V ctrl-M会产生文字ctrl-M字符)。
outfile = infile
呢?
someProg <in >out && mv out in
。
sed -i s/\r// <filename>
或类似的东西;查看man sed
或在网络上获得有关使用的大量信息sed
。
需要指出的一件事是上述“回车”的确切含义;如果您真正的意思是单个控制字符“回车”,那么上面的模式是正确的。如果更一般地说,如果您是指CRLF(回车和换行,这是Windows下实现换行的方式),那么您可能想要替换\r\n
。Linux / Unix中的裸换行符(newline)为\n
。
如果您是Vi用户,则可以使用以下方法打开文件并删除回车符:
:%s/\r//g
或搭配
:1,$ s/^M//
请注意,您应该先按ctrl-v然后按ctrl-m来输入^ M。
^M
-s。解决这个问题需要大量的按键操作,这不是vim的目的。我只想使用sed -i
,然后使用-e's / \ r $ // g'将删除限制为EOL的CR。
如果您使用的操作系统(如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
与其他示例相同的方式在命令行上使用名称。
这是东西
%0d
是回车符。使它与Unix兼容。我们需要使用以下命令。
dos2unix fileName.extension fileName.extension
对于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"
如果您正在运行X环境并且具有适当的编辑器(Visual Studio代码),那么我将遵循以下建议:
只需转到屏幕的右下角,Visual Studio代码就会向您显示文件编码和行尾约定,再显示文件,只需单击一下即可切换显示。
只需在Linux环境中使用可视代码替代notepad ++,您就可以开始使用了。
Notepad++
,Edit / EOL Conversion / Unix (LF)
在Windows系统上使用的命令。
\r
在任何UNIX®系统上删除:这个问题中大多数现有的解决方案都是特定于GNU的,并且不能在OS X或BSD上运行;下面的解决方案应该可以在更多的UNIX系统上使用,并且在任何shell中都可以使用从tcsh
到sh
,甚至在GNU / Linux上也可以使用。
在OS X,OpenBSD和NetBSD上tcsh
以及在Debian GNU / Linux上进行了测试bash
。
sed
:在tcsh
OS X上,以下sed
代码段可与一起使用printf
,因为既不像GNU那样sed
也不以特殊方式echo
处理\r
:
sed `printf 's/\r$//g'` input > output
tr
:另一种选择是tr
:
tr -d '\r' < input > output
sed
和之间的区别tr
:似乎tr
保留了输入文件中缺少尾随换行符的功能,而sed
在OS X和NetBSD上(但在OpenBSD或GNU / Linux上则没有),即使输入缺少任何尾随的换行符也将在文件的末尾插入尾随的换行符。在文件的末尾\r
或\n
末尾。
下面是可用于确保您的系统上这个作品,使用一些样品测试printf
和hexdump -C
; 或者,od -c
如果您的系统丢失,也可以使用hexdump
:
% printf 'a\r\nb\r\nc' | hexdump -C
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000 61 0a 62 0a 63 |a.b.c|
00000005
%
虽然是较旧的帖子,但最近我遇到了同样的问题。由于我在/ 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
注意:尽管与我的工作很接近,但这个示例并不十分准确(此处提及只是为了更好地了解我的工作)
我做了这个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
您可以简单地做到这一点:
$ echo $(cat input) > output
a * b
...