【问题标题】:I want to use grep to move the last 7 characters of each line to another file [duplicate]我想使用 grep 将每行的最后 7 个字符移动到另一个文件 [重复]
【发布时间】:2020-06-22 00:24:56
【问题描述】:

我有一个包含数千行的文本文件。每行的最后 7 个字符是字母和数字的混合(例如 AAP8945 或 GGR6645)。我想将这些保存在单独的文件中。

请原谅菜鸟问题,但我无法解决。

【问题讨论】:

  • @oguzismail — 你也需要-o,不是吗?
  • 欢迎来到 Stack Overflow。 SO 是一个面向专业和爱好者程序员的问答网站。目标是您将一些自己的代码添加到您的问题中,以至少显示您为解决这个问题所做的研究工作。
  • 如果你有 GNU sed 那么@JonathanLeffler 有正确的答案,因为它使用了你要求的工具。你有没有 GNU grep?如果没有,那么您可以使用 sed:sed -e 's/^.*\(.......\)$/\1/'

标签: bash grep


【解决方案1】:

使用 GNU grep

假设你有 GNU grep:

grep -o -E '.{7}$' input > output

-o 选项表示“仅输出匹配的内容”(而不是整行)。这是可以使用grep 完成工作的关键功能。如果不支持 -o(或等效选项),grep 是不适合这项工作的工具。

-E选项用于扩展正则表达式,表示.(任意字符)匹配7次后匹配行尾。

没有 GNU grep

如果您没有 GNU grep(或与 -o 选项或等效选项兼容的 grep),那么您可以改用 sed(GNU 或任何其他变体):

sed -e 's/.*\(.\{7\}\)$/\1/' input > output

这匹配行的开头 (.*) 并捕获行的最后 7 个字符 (\(…\));它用捕获的部分替换整体,并打印结果。如果您的sed 变体具有扩展正则表达式(通常为-E 或有时-r),则:

sed -E -e 's/.*(.{7})$/\1/' input > output

区别在于所需的反斜杠数量。

这两个都将完整地打印任何短行。如果应该省略这些,请使用:

sed -n -e 's/.*\(.\{7\}\)$/\1/p' input > output
sed -n -E -e 's/.*(.{7})$/\1/p' input > output

【讨论】:

  • 或者简单的BRE——grep -o '.......$'(但谁喜欢算'.')
  • 一、二、多——还是太多了?这仍然需要不通用的-o 选项(不属于 POSIX grep,AFAIK)。
  • @DavidC.Rankin 你可以用 BRE 说 grep -o '.\{7\}$'。
  • 哇!谢谢你。学习发生了。我不认为 BRE 会允许以这种方式重复。
  • 再次,这取决于grep,@tshiono 的方言。有很多版本,你可以按照你的建议去做;与其他人,你不能。 (检查:POSIX BRE 确实需要 \(…\) 才能在 BRE 中工作 - 并非总是如此,但 POSIX 1997 需要支持它。)可能如果 grep 支持 -o,它支持 \{7\} 计数符号。编写可移植代码时,一切都会变得棘手。
【解决方案2】:
grep -Eo '.{7}$'

或者没有 grep:

rev input|cut -c -7|rev >output

这里需要双精度 rev,因为我无法使用 cut 从右侧指定文本的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多