Regex UNIX中的子字符串

Regex UNIX中的子字符串,regex,unix,Regex,Unix,假设我有一个字符串“123456789” 我想提取第三、第六和第八个元素。我想我可以用 cut -3, -6, -8 但如果这给了 368 假设我想用一个空格来分隔它们,以获得 3 6 8 我该怎么办?实际上,shell参数扩展允许您直接执行子字符串切片,因此您可以执行以下操作: x='123456789' echo "${x:3:1}" "${x:6:1}" "${x:8:1}" 更新 要对整个文件执行此操作,请在循环中读取该行: while read x; do echo "${

假设我有一个字符串“123456789”

我想提取第三、第六和第八个元素。我想我可以用

cut -3, -6, -8
但如果这给了

368
假设我想用一个空格来分隔它们,以获得

3 6 8

我该怎么办?

实际上,shell参数扩展允许您直接执行子字符串切片,因此您可以执行以下操作:

x='123456789'
echo "${x:3:1}" "${x:6:1}" "${x:8:1}"
更新 要对整个文件执行此操作,请在循环中读取该行:

while read x; do
  echo "${x:3:1}" "${x:6:1}" "${x:8:1}"
done < file
读取x时
;做
回声“${x:3:1}”“${x:6:1}”“${x:8:1}”
完成<文件
(顺便说一句,bash切片是零索引的,因此如果您想要数字“3”、“6”和“8”,您确实需要
${x:2:1}${x:5:1}和{$x:7:1}

您可以使用该工具并在终端中发出以下命令:

sed -r "s/^..(.)..(.).(.).*$/\1 \2 \3/"
解释正则表达式:


要在一个文件上“概括”这一点,您可以在
cat
之后对其进行管道处理,如下所示:

cat file.txt|sed -r "s/^..(.)..(.).(.).*$/\1 \2 \3/"
Perl一行

perl -lne '@A = split //; print "$A[2] $A[5] $A[7]"' file

使用
cut

$ cat input
1234567890
2345678901
3456789012
4567890123
5678901234
$ cut -b3,6,8 --output-delimiter=" " input
3 6 8
4 7 9
5 8 0
6 9 1
7 0 2

-b
选项仅选择指定的字节。可以使用
--output delimiter

@指定输出分隔符。他尝试了
cut
。您使用的是哪个shell
echo$SHELL
@SmithBlack
cut
可以提供所需的输出!谢谢你的回复。是否可以将其推广到提取文件中所有行的第3、第6和第8个字符?是否可以尝试使用
echo“${x:2:1}”${x:5:1}”${x:7:1}”
?在我测试过的两种bash(Linux和OSX)中,字符计数都是基于0的,而不是基于1的。谢谢您的响应。当我们知道绳子的长度时,这一部分就起作用了。如果我们不知道每行中有多少个字符(可能是非常大的数字),这仍然有效吗?当该行至少有8个字符时,这会起作用,因为它会在第8行之后丢弃任何其他字符,所以是的,它可能非常大。不需要猫。只需将文件重定向到sed<代码>sed…谢谢。只是一个后续问题。如果我想提取999个字符,我需要在998“.”后面加“(.”吗?不,放
{998}(.)
为了更简单,我使用了多个点(不带量词),它相当于:
/^.{2}(.)。{2}(.)。$/