例如,给定以下内容:
USCAGoleta9311734.5021-120.1287855805
我想要仅提取:
US
例如,给定以下内容:
USCAGoleta9311734.5021-120.1287855805
我想要仅提取:
US
bash
),但您的系统有bash
,那么您仍然可以通过使用变量调用bash
来使用bash
的内在字符串操作。strEcho='echo ${str:0:2}' # '${str:2}' if you want to skip the first two characters and keep the rest
bash -c "str=\"$strFull\";$strEcho;"
如何考虑Unicode + UTF-8
对于那些对Unicode字符而不仅仅是字节感兴趣的人,让我们进行一个快速测试。在UTF-8中,每个重音元音字符áéíóú
由两个字节组成。
printf 'áéíóú' | LC_CTYPE=en_US.UTF-8 awk '{print substr($0,1,3);exit}'
printf 'áéíóú' | LC_CTYPE=C awk '{print substr($0,1,3);exit}'
printf 'áéíóú' | LC_CTYPE=en_US.UTF-8 head -c3
echo
printf 'áéíóú' | LC_CTYPE=C head -c3
áéí
á
á
á
因此我们可以看到只有awk
+LC_CTYPE=en_US.UTF-8
考虑了UTF-8字符,而其他方法只考虑了三个字节。我们可以通过以下方式进行确认:
printf 'áéíóú' | LC_CTYPE=C head -c3 | hd
这表示:
00000000 c3 a1 c3 |...|
00000003
而c3
本身是垃圾,不会在终端上显示,所以我们只看到了á
。
awk
+ LC_CTYPE=en_US.UTF-8
实际上返回了6个字节。
我们也可以使用等效的测试:
printf '\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb3\xc3\xba' | LC_CTYPE=en_US.UTF-8 awk '{print substr($0,1,3);exit}'
如果您需要一个通用参数:
n=3
printf 'áéíóú' | LC_CTYPE=en_US.UTF-8 awk "{print substr(\$0,1,$n);exit}"
关于Unicode + UTF-8的更具体问题:https://superuser.com/questions/450303/unix-tool-to-output-first-n-characters-in-an-utf-8-encoded-file
在Ubuntu 21.04上进行了测试。
这可能是你想要的:
my $string = 'USCAGoleta9311734.5021-120.1287855805';
my $first_two_chars = substr $string, 0, 2;
参考资料:substr
perl -e 'print substr $ARGV[0], 0, 2' 'USCAGoleta9311734.5021-120.1287855805'
。 - Chas. Owens代码
if mystring = USCAGoleta9311734.5021-120.1287855805
print substr(mystring,0,2)
会打印出 US。
其中 0 是起始位置,2 是要读取的字符数。
awk
。抱歉,我一开始没看出来。 - Dennis Williamsonperl -ple 's/^(..).*/$1/'