我有一个1.5 GB的Windows文本文件,其中某些行以 LF 结尾,大多数行以 CR + LF
结尾请帮助提供sed
脚本
我尝试使用文本编辑器进行所有替换,但是执行文件中的所有替换都花费了很长时间(半小时为1%)。我尝试将其替换为fart
:
fart -c -B -b text.txt "\r\n" "$|$"
有以下结果
replacement 0 occurence(s) in 0 file(s)..
答案 0 :(得分:0)
一个awk:
$ awk '{sub(/(^|[^\r])$/,"&\r")}1' file
对其进行测试(0x0a为LF,0x0d为CR):
$ awk 'BEGIN{print "no\nyes\r\n\n\r"}' > foo
$ hexdump -C foo
00000000 6e 6f 0a 79 65 73 0d 0a 0a 0d 0a |no.yes.....|
0000000b
$ awk '{sub(/(^|[^\r])$/,"&\r")}1' foo > bar
$ hexdump -C bar
00000000 6e 6f 0d 0a 79 65 73 0d 0a 0d 0a 0d 0a |no..yes......|
0000000d
答案 1 :(得分:0)
我会这样做:首先删除所有\r
在行末,然后在行末显式添加\r
。
sed -e 's/\r$//' -e 's/$/\r/' file
这是一个演示:
$ printf "1\r\n2\n3\n4\r\n5\n" > file
$ od -c file
0000000 1 \r \n 2 \n 3 \n 4 \r \n 5 \n
0000014
$ sed -i -e 's/\r$//' -e 's/$/\r/' file
$ od -c file
0000000 1 \r \n 2 \r \n 3 \r \n 4 \r \n 5 \r \n
0000017
这是GNU sed。
答案 2 :(得分:0)
仅安装自动执行的util like unix2dos
会更简单。使用unix2dos
时,建议的将 CR + LF 转换为 $ | $ (并返回)的中间步骤是不必要的。演示:
# first dump a file with both *DOS* and *Unix* style line endings:
hexdump -C <({ seq 2 | unix2dos ; seq 3 4; } )
# the same file, run through unix2dos
hexdump -C <({ seq 2 | unix2dos ; seq 3 4; } | unix2dos)
输出:
00000000 31 0d 0a 32 0d 0a 33 0a 34 0a |1..2..3.4.|
0000000a
00000000 31 0d 0a 32 0d 0a 33 0d 0a 34 0d 0a |1..2..3..4..|
0000000c
或更详细地说,是一个之前/之后的表(有关格式的详细信息,请参见man hexdump
)
hdf() { hexdump -v -e '/1 "%_ad# "' -e '/1 " _%_u\_\n"' $@ ; }
# Note: the `printf` stuff keeps `paste` from misaligning the output.
paste <(hdf <({ seq 2 | unix2dos ; seq 3 4; }) ; printf '\t\n\t\n' ; ) \
<(hdf <({ seq 2 | unix2dos ; seq 3 4; } | unix2dos ))
输出:
0# _1_ 0# _1_
1# _cr_ 1# _cr_
2# _lf_ 2# _lf_
3# _2_ 3# _2_
4# _cr_ 4# _cr_
5# _lf_ 5# _lf_
6# _3_ 6# _3_
7# _lf_ 7# _cr_
8# _4_ 8# _lf_
9# _lf_ 9# _4_
10# _cr_
11# _lf_