【问题标题】:Is there a cleaner way of getting the last N characters of every line?有没有更简洁的方法来获取每行的最后 N 个字符?
【发布时间】:2014-08-17 02:22:34
【问题描述】:

为了简化讨论,让N = 3

我目前提取文件或流中每一行的最后三个字符的方法是使用sed 捕获组中的最后三个字符并将整行替换为该组。

sed 's/^.*\(.\{3\}\)/\1/'

它可以工作,但似乎过于冗长,尤其是当我们与获取一行中的三个字符的方法进行比较时。

cut -c -3

有没有更简洁的方法来提取每行的最后 N 个字符?

【问题讨论】:

  • @PeterSchneider 这将删除最后 3 个字符,而不是保留它们。
  • @Barmar 确实!我看错了问题。
  • @Barmar,我稍微修改了这个问题。我写的太具体了。
  • @Barmar,我目前正在测试下面答案的通用版本。

标签: bash command-line awk sed cut


【解决方案1】:

grep -o '...$' 很简单:

cat /etc/passwd  | grep -o '...$'
ash
/sh
/sh
/sh
ync
/sh
/sh
/sh

或者更好:

N=3; grep -o ".\{$N\}$" </etc/passwd
ash
/sh
/sh
/sh
ync
/sh
/sh

这样您就可以将N 调整为您喜欢的任何值。

【讨论】:

  • 这个答案在一般情况下也适用于egrep -o '.{3}$'。时间到了我会接受的。 :)
  • @merlin2011 这将丢弃少于 3 个字符的行。如果这是您想要的行为,很好,否则,您可能需要考虑 .{1,3}$
  • 仅供参考,` egrep -o '。{3}$` 需要连续 3 次相同的字符,所以它不能推广到这种情况
  • @Jezzamon 不,它没有,它需要任何 3 个字符。 egrep 已弃用,取而代之的是 grep -E 顺便说一句。
【解决方案2】:
rev /path/file | cut -c -3 | rev

【讨论】:

  • 我也喜欢这个答案,因为我几乎忘记了转速。 +1!稍后我还将对两者进行基准测试,看看双反转是否比正则表达式更快。
  • 用 3 个 shell 命令替换单个 sed 'verbose' 会使用更多资源,这不是有点笨吗?
  • 不,更容易记住。
  • 我同意@NeronLeVelu,这不是cleaner 的方式。
【解决方案3】:

当它是一个很小的命令时,为什么要强调简洁?普遍性更为重要:

$ cat file
123456789
abcdefghijklmn

从第 4 个字符开始打印 3 个字符:

$ awk '{print substr($0,4,3)}' file
456
def

从倒数第四个字符开始打印 3 个字符:

$ awk '{print substr($0,length($0)-3,3)}' file
678
klm

要从每行中间的 [周围] 打印 3 个字符:

$ awk '{print substr($0,(length($0)-3)/2,3)}' file
345
efg

【讨论】:

  • 如何将其保存到变量中?
  • 您是在问 1) 如何将 awk 命令的输出保存到 shell 变量中,还是 2) 如何将子字符串保存到 awk 变量中,或者 3) 其他?
  • 我说的是 1。不过我找到了...f_id="$(echo $filename | awk '{print substr($0,length($0)-5,2)}')"
  • 请注意:length($0) 仅相当于 length
  • 是的,我知道,我只是发现添加 4 个额外的字符更清晰。我可以接受length(),但是你只需要节省2个字符,而不是明确说明你得到的长度,$0,所以这似乎不值得权衡,我讨厌length,因为它看起来像一个变量和它的变体是一个非常常见的变量名称(即我们经常必须将一些字符串或数组的长度保存在一个变量中)。
【解决方案4】:

纯 bash 解决方案:

$ while read -r in; do echo "${in: -3}"; done
hello
llo
$

sed

$ sed 's,.*\(.\{3\}\)$,\1,'
hallo
llo
$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多