什么linux shell命令返回字符串的一部分?

What linux shell command returns a part of a string?

本问题已经有最佳答案,请猛点这里访问。

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

后续类似问题:

  • 提取bash中的子字符串


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

要举个例子,请尝试:

1
echo"abcdefg" | cut -c3-5

其产量

1
cde

其中,-cN-M通知cut命令将列N返回到M中,包括该列。


从bash手册页:

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

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


在"pure"bash中,您有许多用于(子)字符串操作的工具,主要是但不限于参数扩展:

1
2
3
${parameter//substring/replacement}
${parameter##remove_matching_prefix}
${parameter%%remove_matching_suffix}

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

1
2
3
${parameter:offset}
${parameter:offset:length}
${parameter:offset:length}

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

1
2
3
4
${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很容易找到它们,我觉得进一步扩展这篇文章不值得。


在bash中,您可以尝试以下方法:

1
2
3
4
5
stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.

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

Linux文档项目中的更多示例


expr(1)有一个子命令:

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

如果您没有bash(可能是嵌入式Linux),并且不希望使用cut(1)所需的额外"echo"进程,那么这可能很有用。


1
${string:position:length}