使用`sed`或`fart`替换文本文件中的CR LF(查找和替换文本)

时间:2019-02-08 14:01:20

标签: windows text sed character-replacement

我有一个1.5 GB的Windows文本文件,其中某些行以 LF 结尾,大多数行以 CR + LF

结尾

请帮助提供sed脚本

  • 将所有 CR + LF 替换为 $ | $
  • CR + LF
  • 替换所有 LF
  • CR + LF
  • 替换所有 $ | $

我尝试使用文本编辑器进行所有替换,但是执行文件中的所有替换都花费了很长时间(半小时为1%)。我尝试将其替换为fart

fart -c -B -b text.txt "\r\n" "$|$"

有以下结果

replacement 0 occurence(s) in 0 file(s)..

3 个答案:

答案 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_