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