bash - 如何在 shell 脚本中提取字符串的前两个字符?

标签 bash shell grep sh gnu-coreutils

例如,给定:

USCAGoleta9311734.5021-120.1287855805

我只想提取:

US

最佳答案

如果您正在使用 bash shell(根据您的评论,您似乎是),可能最有效的方法是使用参数扩展的子字符串变体:

pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US

这会将 short 设置为 long 的前两个字符。如果 long 小于两个字符,则 short 将与其相同。

如果您要经常这样做(例如您提到的每个报告 50,000 次),这种 shell 内方法通常会更好,因为没有进程创建开销。所有使用外部程序的解决方案都会受到这种开销的影响。

如果您还想确保最小长度,您可以事先用类似的东西填充它:

pax> long="A"
pax> tmpstr="${long}.."
pax> short="${tmpstr:0:2}" ; echo "${short}"
A.

这将确保长度小于两个字符的任何内容都在右侧用句点填充(或其他内容,只需更改创建 tmpstr 时使用的字符)。目前尚不清楚您是否需要它,但我想为了完整性而将其放入。


话虽如此,有许多方法可以使用外部程序(例如,如果您没有可用的 bash)执行此操作,其中一些是:

short=$(echo "${long}" | cut -c1-2)
short=$(echo "${long}" | head -c2)
short=$(echo "${long}" | awk '{print substr ($0, 0, 2)}'
short=$(echo "${long}" | sed 's/^\(..\).*/\1/')

前两个(cuthead)对于单行字符串是相同的——它们基本上都只是返回前两个字符。它们的不同之处在于 cut 将为您提供每行的前两个字符,而 head 将为您提供整个输入的前两个字符

第三个使用 awk 子字符串函数提取前两个字符,第四个使用 sed 捕获组(使用 ()\1) 捕获前两个字符并用它们替换整行。它们都类似于 cut - 它们在输入中传递每行的前两个字符。

如果您确定您的输入是一行,那么这些都不重要,它们都具有相同的效果。

关于bash - 如何在 shell 脚本中提取字符串的前两个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1405611/

相关文章:

bash - 根据包含数字和不包含数字的行对 CSV 中的行进行排序

regex - shell 或正则表达式中 "match everything but these strings"的最紧凑版本是什么?

linux - 多个站点的 DIG 查询时间平均速度

bash - 如何在 AWK 中打印 CSV 中的一系列列?

linux - 仅当 find 命令有结果时才 tar

string - 如何在 Bash 脚本中回显 "$x_$y"?

bash - 文档中唯一单词的数量

makefile - Makefile中的Grep退出代码

bash - 理解(多重和自动)文件名引用

linux - 从 shell 将 HTML 表转换为 CSV 文件