106

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


随后类似的问题:

4

6 回答 6

192

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

举个例子,试试:

echo "abcdefg" | cut -c3-5

产生

cde

Where-cN-M告诉 cut 命令将列返回NM(包括)。

于 2008-10-20T18:39:35.893 回答
104

从 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.

于 2008-10-20T18:35:53.063 回答
35

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

${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,我觉得没有必要进一步扩展这篇文章。

于 2011-11-12T21:16:11.920 回答
23

在 bash 你可以试试这个:

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

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

Linux 文档项目中的更多示例

于 2008-10-20T18:36:58.880 回答
16
${string:position:length}
于 2008-10-20T18:37:54.370 回答
14

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

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

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

于 2008-10-21T01:05:27.940 回答