-2

我有一个 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)..
4

3 回答 3

0

只需安装一个类似unix2dos自动执行的实用程序就更简单了。使用建议的将CR+LF转换为$|$unix2dos的中间步骤(和返回),是不必要的。演示:

# 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_
于 2019-02-10T18:44:04.230 回答
0

我会这样做:首先删除所有\r行尾,然后显式添加 a\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。

于 2019-02-08T15:35:44.513 回答
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
于 2019-02-08T14:38:59.217 回答