哪个命令更适合删除空行在十六进制转储文件中,将部件粘合在一起?
sed -i '/^$/d' file.log
sed -i '/^\s*$/d' file.log
或者可能awk
?
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
801c3ff0: 0c0a 8935 2405 0002 5040 0064 0000 1021 | [email protected]...!
801c4000: 0200 2021 0c0a 8935 2405 0002 0200 2021 | .. !...5$..... !
801c4010: 0040 2821 2406 0002 3c07 8074 0c0a 86a5 | .@(!$...<..t....
801c4020: 24e7 10fc 0040 2021 3c05 8074 0c1b 634c | $....@ !<..t..cL
答案1
您的第二个sed
解决方案几乎在所有情况下都应该可以正常工作,但这里还有一些其他解决方案,因为:
file.log
:
$ cat file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
第二行是完全空的行,第 4 行有一个空格,第 6 行有一个制表符
sed
:
sed '/^$/d' file.log
$ sed '/^$/d' file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
如上所示,这不会删除包含空格的行
sed '/^\s*$/d' file.log
$ sed '/^\s*$/d' file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
注意:上述解决方案似乎不适用于 BSD sed
sed '/^[[:space:]]*$/d' file.log
$ sed '/^[[:space:]]*$/d' file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
该解决方案应该适用于 GNU 和 BSD sed
awk
:
awk 'NF' file.log
$ awk 'NF' file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
这不会就地修改,但如果你有 GNU awk,你可以使用以下命令
awk -i inplace 'NF' file.log
grep
:
grep -v '^$' file.log
$ grep -v '^$' file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
如上所示,这不会删除包含空格的行。此外,这不会修改该文件
grep . file.log
$ grep . file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
如上所示,这不会删除包含空格的行。此外,这不会修改该文件
grep -v '^\s*$' file.log
$ grep -v '^\s*$' file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
这不会就地修改文件,但可以使用重定向来创建具有所需内容的新文件
tr
:
tr -s '\n' <file.log
$ tr -s '\n' <file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
如上所示,这不会删除包含空格的行。此外,这不会修改该文件
perl
:
perl -n -e "print if /\S/" file.log
$ perl -n -e "print if /\S/" file.log
801c3fb0: 0000 2821 0c18 9741 2406 0020 afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014 afa2 0038 8e22 00e4 2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821 03a0 3021 0040 f809 27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d 0040 9021 2630 0008 0200 2021 | .@...@.!&0.... !
要就地修改,请使用以下命令:
perl -i.bak -n -e "print if /\S/" file.log
答案2
这两个命令之间的唯一区别sed
是第二个命令在空行中考虑空格或制表符。
您的文件的空白行中似乎有空格/制表符,这就是第一个sed
命令没有删除它们的原因。
使用第二个sed
命令。我已经测试并确认它适用于您的文件。