Bash 使用 awk 删除模式后的所有字符

Bash 使用 awk 删除模式后的所有字符

我有一个以下形式的输入文件:

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'

您必须有充分的理由不希望以换行符结尾,但请记住,常规文本文件必须以换行符结尾。

相关内容