例如,给定:
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/')
前两个(cut
和 head
)对于单行字符串是相同的——它们基本上都只是返回前两个字符。它们的不同之处在于 cut
将为您提供每行的前两个字符,而 head
将为您提供整个输入的前两个字符
第三个使用 awk
子字符串函数提取前两个字符,第四个使用 sed
捕获组(使用 ()
和 \1
) 捕获前两个字符并用它们替换整行。它们都类似于 cut
- 它们在输入中传递每行的前两个字符。
如果您确定您的输入是一行,那么这些都不重要,它们都具有相同的效果。
关于bash - 如何在 shell 脚本中提取字符串的前两个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1405611/