【问题标题】:Remove a sequence of chars at the end of file including LF (linefeed)删除文件末尾的一系列字符,包括 LF(换行符)
【发布时间】:2016-01-12 12:59:48
【问题描述】:

我有一个包含一些 PCL 序列的文件。我在文件末尾有这个序列(十六进制):

461b 2670 3158 0a    F.&p1X.

我想删除序列:&p1X,包括后面的字符。在 99% 的情况下,LF 遵循该顺序。

我试过这个命令:

sed -b 's/\o33&p[0-9]X$//Mg' ~/test.txt >test2.txt

但是,它在 test2.txt 的末尾附加了 LF。此外,如果我指定 . 而不是 $,则它不再与该行匹配。

如果你想玩这个,使用这个命令生成输入文件:

echo -e "SomeString\033&p1X" > ~/test.txt

重定向在末尾附加一个 LF 字符。

谢谢

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:

    如果我理解得很好,您肯定知道您的文件最后包含该字符序列。如果是这种情况,我会简单地截断最后六个字节。无论最后一个字符是换行符还是您想要的任何内容,它都会起作用...

    例子:

    $ echo -e "SomeString\033&p1X" > test.txt
    $ od -c test.txt
    0000000   S   o   m   e   S   t   r   i   n   g 033   &   p   1   X  \n
    0000020
    $ truncate -s -6 test.txt 
    $ od -c test.txt 
    0000000   S   o   m   e   S   t   r   i   n   g
    0000012
    

    这也非常有效,因为它会使用系统调用 truncate()。

    【讨论】:

    • 某些文件可能不包含此序列。不幸的是,这就是为什么截断不起作用的原因。
    【解决方案2】:

    这似乎基于thread

    perl -pi -e 's/\x1b&p[0-9]X\n//g' ~/test.txt
    

    (我也是 perl 初学者 - 任何 cmets 都会受到赞赏)。

    【讨论】:

    • X 后面的 [其他] 非换行符是什么?目的是什么?看起来文件主要是十六进制的,你想去掉非十六进制的行尾吗?你总是想去掉 [可选] 换行符吗?如果您对 perl 感兴趣,我已经编写它 20 多年了,我很乐意发布带有解决方案和一些其他提示的答案。如果您可以发布一个显示所有变体(例如 5-10 行)的数据文件,这也会有所帮助
    • @CraigEstey “看起来文件大部分是十六进制......”是什么意思?文件既不是十六进制也不是非十六进制。文件只包含你可以用十六进制格式表示的字节。
    • @mauro 好吧,“十六进制转储文件”[或只是“十六进制文件”]意味着该文件包含十六进制转储程序的输出(例如 odxxd 等。 )。我错过了“(十六进制)”,所以样本看起来像一条十六进制线(没有 alpha),而预告片是一些额外的东西,需要剥离才能读取左侧的十六进制值。如果我发布问题,我会显示一些有效的左侧数据,因为这有时会影响正则表达式的含义[与 just 坏部分的带有 alpha 的十六进制转储相比]跨度>
    猜你喜欢
    • 2013-04-28
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多