【问题标题】:What linux shell command returns a part of a string? [duplicate]什么 linux shell 命令返回字符串的一部分? [复制]
【发布时间】:2010-09-18 04:15:58
【问题描述】:

我想找一个可以返回部分字符串的linux命令。在大多数编程语言中,它是 substr() 函数。 bash 是否有任何可用于此目的的命令。我希望能够做这样的事情...... substr "abcdefg" 2 3 - 打印cde


后续类似问题:

【问题讨论】:

  • 不是真正的重复。 Extract substring in Bash 要求截取由特定分隔符包围的字符序列。这个问题要求剪掉一段字符串,给出偏移量和长度的数值,就像substr() 一样。这不一样。

标签: linux string bash substr


【解决方案1】:

如果您正在寻找一个 shell 实用程序来执行类似的操作,您可以使用 cut 命令。

举个例子,试试:

echo "abcdefg" | cut -c3-5

产生

cde

其中-cN-M 告诉剪切命令将列N 返回到M,包括在内。

【讨论】:

  • 尽管我有“接受”的答案,但我想指出,如果您想进行大量子字符串提取,请使用内置的子字符串扩展(请参阅 dmckee 的答案)是更有效的方法。也就是说,cut 更容易记住和使用。
  • 如果我们想从第 3 个字符开始到字符串结尾,我们需要做什么,即:“abcdef”我们需要 cdef 然后 echo“abcdef”|剪切-c3?”
  • cut 有一些您可以使用的有用参数。 -f 将其从计数字符更改为计数字段,默认情况下由 TAB 或您在-d 之后指定的任何字符分隔。所以要让你的输入字符串直到但不包括第一个斜杠(正是我想要的),你可以这样做:cut -d/ -f-1,它可以读作“在由 / 分隔的子字符串上剪切,只返回第一个”。
  • 考虑快速指出:-c是做什么的?
  • @ArtOfWarfare 非常感谢您的评论 - 它解释了以下答案:stackoverflow.com/a/428118/3665178
【解决方案2】:

来自 bash 手册页:

${parameter:offset}
${parameter:offset:length}
        Substring  Expansion.   Expands  to  up  to length characters of
        parameter starting at the character  specified  by  offset.
[...]

或者,如果您不确定是否拥有bash,请考虑使用cut

【讨论】:

  • 有趣,我不知道这个。如需更灵活的子字符串选项:man cut
  • Shell 扩展不错,但是...嗯。
  • 我基本同意。我通常在 vanilla /bin/sh 中编写 shell 脚本。但我发现我必须了解一些基础知识才能阅读 shell 脚本...
  • 是否有类似${str:3:-3} 的东西来提取从 char 3 到最后一个 char 减 -3 的子字符串?
  • 哦,但是echo ${str:2:-2} 可以满足我的要求。
【解决方案3】:

在“纯”bash 中,您有许多用于(子)字符串操作的工具,主要但不限于 parameter expansion

${parameter//substring/replacement}
${parameter##remove_matching_prefix}
${parameter%%remove_matching_suffix}

索引子字符串扩展(具有负偏移的特殊行为,并且在较新的 Bash 中为负长度):

${parameter:offset}
${parameter:offset:length}
${parameter:offset:length}

当然还有对参数是否为空进行操作的非常有用的扩展:

${parameter:+use this if param is NOT null}
${parameter:-use this if param is null}
${parameter:=use this and assign to param if param is null}
${parameter:?show this error if param is null}

它们具有比列出的更多可调整的行为,正如我所说,还有其他操作字符串的方法(一种常见的方法是 $(command substitution) 与 sed 或任何其他外部过滤器结合使用)。但是,输入man bash 很容易找到它们,我认为没有必要进一步扩展这篇文章。

【讨论】:

  • 请记住,“索引子字符串扩展”不是POSIX standard 的一部分。因此,虽然它在 bash 上可能比其他方法更快,但当您想在不同的操作系统上运行脚本时,它可能会妨碍您。
【解决方案4】:

在 bash 中你可以试试这个:

stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.

echo ${stringZ:0:2} # prints ab

The Linux Documentation Project 中的更多示例

【讨论】:

  • 有没有用无穷大替换数字 2 的语法?
  • @ToiletGuy 是的,丢弃它。 echo ${stringZ:9} 打印 ABCabc
【解决方案5】:
${string:position:length}

【讨论】:

  • 像往常一样,坐在这里没有赞成票,WTF。这在我的 parse_git_branch 命令中对我来说非常有效。太棒了!
  • 长度能变成无穷大吗?
【解决方案6】:

expr(1) 有一个 substr 子命令:

expr substr <string> <start-index> <length>

如果您没有 bash(可能是嵌入式 Linux)并且您不希望使用 cut(1) 所需的额外“回声”过程,这可能会很有用。

【讨论】:

  • Heredocs 在没有 bash 的情况下工作(&lt;&lt;EOF,你的内容,然后是 EOF),并且通常(在 TMPDIR 位于 tmpfs/shmfs/etc 的系统上)成本低于运行子 shell echo 会。
猜你喜欢
  • 2013-04-23
  • 2014-03-12
  • 2013-04-09
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2018-12-25
相关资源
最近更新 更多