我用过
sed 's/\r\n$//' inputFile
然而,它没有奏效。我不知道为什么
我也试过
awk '{ printf "%s", $0 }' inputFile
但它只删除\ n但不删除\ r
如何在linux的一行末尾删除CRLF(\ r \ n)的特定组合?
P.S。
考虑到我的问题的具体情况,我认为这不是this的重复。我希望删除行末尾的CRLF(\ r \ n)。 tr
无法正常工作,因为tr
要删除的外观不一定在该行的末尾,并且管理员要求不安装dos2unix
。在我的情况下sed 's/\r\n$//' inputFile
无效,我几乎尝试了this中所有可能的解决方案。
顺便说一下,使用tr
时,要移除的外观不一定在该行的末尾,而\r\n
中的tr
是一组\r
和\n
。换句话说,它会删除\r
中的\r
位于该行的中间位置。
澄清:
我有一行输入。我希望\r\n
完全删除。
答案 0 :(得分:1)
完全不同的解决方案,只是为了好玩(但它有效)。假设您已安装xxd
:
xxd -ps -c 1 inputFile |
awk 'BEGIN {prev=""} {if ($0=="0a" && prev=="0d") {prev="skip"} else { if (prev!="skip" && prev!="") {print prev} prev=$0 } } END {if (prev!="") {print prev}}' |
xxd -r -ps
基本上它将文件转换为每个字符的2位十六进制,然后使用awk过滤它,寻找2个匹配的行(" 0d"" 0a&#34 ;,这是{{ 1}})连续跳过它们。
但实际上,我只是建议使用python或perl。其中一个应该已经在系统上。例如:
\r\n
答案 1 :(得分:0)
read string <InputFile
echo -n "${string%$'\r'}"
说明:read
将逐行读取,因此自然地删除换行符。然后${variable%$'\r'}
将移除 1 尾随 CR 。
请查看help read
有关这种方式的限制和选项:
printf ' foo\\x\r\t bar\r\n' > InputFile
IFS= read -r string <InputFile
echo -n "${string%$'\r'}" | od -A n -t a -t c
sp f o o \ x cr ht sp b a r
f o o \ x \r \t b a r
(我使用-t c
和 -t a
,因为第二个是可读,但不要明确地显示空格。)
这也可以在常规shell下使用:
CR=`printf \\\r`
read string <InputFile
echo -n "${string%$CR}"
要在行尾添加 CR ,请使用:
sed -e 's/\r$//'
在Unix的sed
下,\n
分隔 行,所以当你不使用N
sed命令时可能永远不会在一行中找到\n
。
但是如果你想合并所有的行:
sed -ne ':;N;$!b;s/\r\n//g;p'
除了文件末尾之外,这将删除所有CRLF
。 (您可以使用bash ${var%$'\r\n'}
或head -c -2
)
sed -ne ':;N;$!b;s/\r\n//g;p' | head -c -2
答案 2 :(得分:0)
Perl相当便携,并且能够很好地处理这个问题。
perl -pe 's/\r\n//' file
这将留下任何单独的\r
或\n
,但如果它们按此特定顺序依次发生,则将其删除。
答案 3 :(得分:0)
您可以使用 GNU awk:
<强>之前:强>
0000000 S i n g o \n D i n g o \n \r P i n
0000020 g o \r M i n g l o \r \n S i n g l
0000040 i \r \n
0000043
<强>操作强>
$ awk 'BEGIN{RS="^$"}{printf "%s",gensub(/\r\n/,"","g")}' file1 > file2 && mv file2 file1
<强>后强>
$ od -tc file1
0000000 S i n g o \n D i n g o \n \r P i n
0000020 g o \r M i n g l o S i n g l i
0000037
如果您希望将gensub(/\r\n/,"","g")
替换为gensub(/\r\n/,"\n","g")
,您可能希望将CRLF
更改为LF
。
注意:
print
,因为它会在最后生成LF
。而是将printf
与格式字符串一起使用。答案 4 :(得分:0)
如果它只有一行而且你知道最后肯定有\r\n
,你可以使用head
并删除最后2个字节:
head -c -2 inputFile
答案 5 :(得分:0)
我自己认为如果不熟悉perl或python,以下方法也很好
import Cocoa
class ThemedScrollView: NSScrollView {
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
}
}
答案 6 :(得分:-2)
要从DOS行中取出unix行,只需删除回车符(CR)即可。 sed命令如下:
sed&#39; s / \ r // g&#39; inputfile&gt; OUTPUTFILE
试一试。