【问题标题】:How can I output the number on the nth position in a string?如何输出字符串中第 n 个位置的数字?
【发布时间】:2018-12-12 11:28:50
【问题描述】:

使用 bash,假设我有以下字符串

string="Same bought 5 bananas, 12 apples, 2 peaches and 16 oranges"

我怎样才能修剪除第 n 个数字之外的所有内容。在这种情况下,我想输出 12,这是字符串中的第二个数字。

如何使用 bash、grep 或 sed 做到这一点?

【问题讨论】:

  • 如果 X 未知,如何确定它是 X?
  • @tripleee im 用 X 表示未知数。X 实际上是一个整数
  • 我想说的是你的问题不清楚。如果我们不知道 X 是什么,或者我们如何找出答案,那么可接受的答案是什么样的?
  • 显然,如果你知道 X 是 1,那么答案是微不足道的; sed 's/.*1.*/1/ 但是你需要这个变量做什么?替换后的结果显然与输入字符串相同,因此执行任何替换都没有意义。或者你想找出字符串是否包含 1? case $string in *1*) echo true;; esac
  • 问题是我不想使用字符 1 因为 X 并不总是 1

标签: bash sed grep text-manipulation


【解决方案1】:

这可能对你有用(GNU sed):

sed 's/^\([^0-9]*\([0-9]*\)\)\{2\}.*/\2/;/^$/d' file

这会将当前行替换为第二次出现的一组数字。除非输出数字,否则该行将被删除。

【讨论】:

  • 感谢您的努力,您对我自己的解决方案也有什么看法
【解决方案2】:

Solution Using sed

根据Paul HodgesTriplee grep -Eo '[0-9]+' <<<"$string"| sed 'nq;d'


其中n是数字的位置

sed 'NUMq;d'
NUM 是要打印的行。
2q 在第二行表示退出。
d 将删除除最后一行之外的所有其他行

【讨论】:

  • '2q' 在第二行表示退出,但不会停止打印该行。 'd' 说删除你来到的每一行,这确实阻止打印这些行。不过它会按顺序检查它们,因此'2q;d' 将在第 2 行退出(并刷新打印),然后再删除,但不会在第 1 行,因此d 会阻止打印第 1 行,但不会阻止第 2 行的打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
相关资源
最近更新 更多