What linux shell command returns a part of a string?
我想找到一个Linux命令,它可以返回字符串的一部分。在大多数编程语言中,它是substr()函数。bash是否有任何可以用于此目的的命令?我想做这样的事…substr"abcdefg" 2 3—打印cde。
后续类似问题:
- 不是真的复制品。提取bash中的子字符串要求剪切由某个分隔符包围的字符序列。这个问题要求切割出一段字符串,给出偏移量和长度的数值,就像substr()所做的那样。这不一样。
如果您正在寻找一个shell实用程序来执行类似的操作,那么可以使用cut命令。
要举个例子,请尝试:
1
| echo"abcdefg" | cut -c3-5 |
其产量
其中,-cN-M通知cut命令将列N返回到M中,包括该列。
- 尽管我有"可接受"的答案,但我想指出,如果您想进行大量的子字符串提取,使用内置子字符串扩展(参见dmckee的答案)是更有效的方法。也就是说,切割更容易记忆和使用。
- 如果我们想从第3个字符开始到字符串末尾,即:"abcdef",我们需要cdef,然后echo"abcdef"cut-c3,我们需要做什么?
- cut有一些有用的论据可以使用。-f将其从计数字符更改为计数字段,默认情况下由制表符分隔,或由-d后面指定的任何字符分隔。因此,要使输入字符串一直到但不包括第一个斜杠(正是我想要的),您可以这样做:cut -d/ -f-1,它可以被理解为"在用/分隔的子字符串上剪切,只返回第一个"。
从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。
- 有趣的是,我不知道这件事。对于更灵活的子串选项:手动切割
- 外壳扩展很好,但是…无聊的。
- 我基本同意。我通常用vanilla/bin/sh编写shell脚本,但我发现我必须知道一些bashims才能阅读shell脚本…
- 是否有类似于${str:3:-3}的方法从char 3到最后一个char减去-3提取子字符串?
- @Becko我现在的bash手册页(MacOS 10.12,所以我认为BSD的血统)比上面的引用要多得多,包括If offset evaluates to a number less than zero, the value is used as an offset from the end of the value of parameter.,意思是你想要${str:-3:3}。
- 不起作用:str="abcdefghijklmn"; echo ${str:-2:2}返回abcdefghijklmn
- 哦,但是以东十一〔五〕做我想做的。
- @Becko我想我们在"评估到"上遇到麻烦了。你的例子都不适合我,但是str="abcdefghijklmn"; echo ${str:(-2):2}返回mn。这就是为什么我放弃了去理解贝壳到底在做什么。
- @德马克,我在江户十一〔八〕号。
在"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很容易找到它们,我觉得进一步扩展这篇文章不值得。
- 请记住,"索引子字符串扩展"不是POSIX标准的一部分。因此,尽管它在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"进程,那么这可能很有用。
- 这里的文档不使用bash(<,您的内容,然后是EOF,并且通常(在系统中,TMPDIR在tmpfs/shmfs/etc上)比运行echo的子shell成本低。
1
| ${string:position:length} |
- 像往常一样,坐在这里,没有上票,WTF。这对我的parse-git-branch命令非常有用。奈斯!