【问题标题】:Incorrectly deleting last characters from file错误地从文件中删除最后一个字符
【发布时间】:2020-09-26 08:00:57
【问题描述】:

在我的子进程中,我想从我的 txt 文件中的每一行中删除最后 4 个字符。然而,线条的长度不同。我看过很多页面,包括How to shave off last character using sed?,但似乎没有任何正确的做法。我有大约 100 行,前 38 行没有正确删除前 4 个字符。一个看似随机的数字被删除。在第一行之后,之后的所有行都有我预期的输出。如何?现在我有:

subprocess.run(['sed', 's/.\{4\}$//', 'infile.txt'])

文件末尾总是有四个无用字符 - /pid:

3726-weinberg/pid
11717-christopher/pid
11138-span/pid
.
.
.
2932-smith/pid
.
.
.

问题是输出是:

3726-w
11717-chri
111
.
.
.
2932-smith //line 39! all good now
.
.
.

但我期待:

3726-weinberg
11717-christopher
11138-span
.
.
.
2932-smith //line 39! all good now
.
.
.

Sed 不一定是解决方案。如果 truncate 或 cut 或任何其他选项也有效,请随时告诉我。我选择 sed 是因为我在程序的另一部分使用它。

【问题讨论】:

  • 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。
  • 我已经使用您的准确输入执行了您的准确 python 代码并且它可以工作。此外,在您的描述中,它不是“看似随机的数字被删除”,您的测试输出表明,对于第一行,最后 11 个字符被删除而不是 4 个。
  • 请指定您正在运行的 Python 版本。
  • @thanasisp - 你没有得到我得到的输出?为什么会这样?我不明白
  • contactme8359 是的,它有效。可能您必须提供更多信息才能得到答案。可能是整个输入文件,你运行它的环境等等。可能不是代码问题。

标签: python sed subprocess truncate


【解决方案1】:

此链接可能会有所帮助。 Remove last two characters from each line.

sed 's/....$//' filename

这里每个点 '.'代表字符,$从行尾读取字符

【讨论】:

    【解决方案2】:

    是因为你的行只有三个字符或更短吗?如果该行至少有四个字符长,您当前的子进程只会删除最后四个字符。如果这是问题所在,以下小改动将起作用(这似乎适用于我测试过的输入):

    subprocess.run(['sed', 's/.\{1,4\}$//', 'infile.txt'])
    

    【讨论】:

    • 不,不是因为我的行少于四个字符。我的行大约有 10-15 个字符长,sed 删除的内容比应有的要多得多。不知道为什么。更新帖子以反映我的意思。
    【解决方案3】:

    也许在 python 中更容易做到这一点。

    with open('infile.txt', 'r') as f:
        lines = f.read()
    out = [line[:-4] for line in lines.split('\n')]
    with open('infile.txt', 'w') as f:
        f.write('\n'.join(out))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2013-06-05
      • 2017-08-19
      • 2021-11-06
      相关资源
      最近更新 更多