我有一个以下形式的输入文件:
something here
somethingElseHere^[%-somestuff here
^[%-somestuff here
注意这^[
是转义字符\x1b
。
所以我想做的是^[
在 bash 脚本中第一次出现后删除文件上的所有内容,所以我最终应该得到这样的结果:
something here
somethingElseHere
我的解决方案是:awk -F "\x1b" {'print $1'}
但这将其作为输出:
something here
somethingElseHere
(empty line here)
所以它在最后一行之后添加了一个额外的空行。不过,如果我手动删除它,我会得到一个额外的字节。我制作了一个 C++ 程序,它读取文件直到\x1b
字符并将所有读取的字符写入一个单独的文件中,但使用 AWK,删除多余的行后,我仍然比使用 C++ 多获得 1 个字节。
编辑:
也许这是使用 AWK 时添加的 EOL 字符?我在使用C++程序时不添加它。
更新:
我刚刚尝试了一些命令,如果我在 中打开它们,大多数命令都会起作用vi
,但它们仍然有一个额外的字节,我不知道它来自哪里。
$hexdump -x file1
0000000 4329 706f 7279 6769 7468 6328 2029 3931
0000010 3939 4d20 6369 6f72 6f73 7466 4320 726f
0000020 6f70 6172 6974 6e6f 610a 6362 6564 6766
0000030 6968 6b6a 6d6c 6f6e 7170 7372 7574 7776
0000040 7978 534d 5020 4c43 4c58 6f46 746e 3020
0000050 3130 a8f8 4955 0a42
0000058
$hexdump -x file2
0000000 4329 706f 7279 6769 7468 6328 2029 3931
0000010 3939 4d20 6369 6f72 6f73 7466 4320 726f
0000020 6f70 6172 6974 6e6f 610a 6362 6564 6766
0000030 6968 6b6a 6d6c 6f6e 7170 7372 7574 7776
0000040 7978 534d 5020 4c43 4c58 6f46 746e 3020
0000050 3130 a8f8 4955 0042
0000057
在我用 bash 生成的 file1 中,它添加了一个额外的0x0a
(换行符)。
答案1
这是 GNU 的解决方案sed
:
sed -z 's/\x1b.*//'
以下是awk
基于 OP 评论的解决方案:
awk -F '\x1b' 'NF > 1 { printf "%s", $1; exit } 1'
您必须有充分的理由不希望以换行符结尾,但请记住,常规文本文件必须以换行符结尾。