我有一个命令,可以输出具有以下模式的列表
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
...
如何使用sed
bash 中的类似方法分别获取“_T”和“_s”后面的数字?
输出应如下所示
8
8
8
10
10
10
和
1
5
10
1
5
10
分别为_T
和_s
我的命令的第一部分如下所示:
for f in $(find . -name "someFile.txt" | sort); do echo $f; done | grep /someFolderName/
基本上,我想将该命令添加到上面给出的命令中。
答案1
使用sed
模式分组来捕获所需的部分:
your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)$/\1 \2/'
([0-9]+)
是第一个捕获组,[0-9]
匹配之间的任意数字0-9
,在本例中+
表示前一个标记的一个或多个匹配[0-9]
([0-9]+)
是第二个捕获的组在替换模式中,两个捕获组分别由
\1
和引用\2
。
例子:
$ cat file.txt
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
$ sed -r 's/.*_T([0-9]+)_s([0-9]+)/\1 \2/' file.txt
8 1
8 5
8 10
10 1
10 5
10 10
更改替换模式以满足您的需要,例如不带任何空格:
your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)/\1\2/' file.txt
回答已编辑的问题:
为了_T
:
your_command | grep -Po '.*_T\K\d+' ## Using grep
your_command | sed -r 's/.*_T([0-9]+).*/\1/' ## Using sed
为了_s
:
your_command | grep -Po '.*_s\K\d+$' ## Using grep
your_command | sed -r 's/.*_s([0-9]+)$/\1/' # Using sed
答案2
使用 AWK:
command | awk -F_T\|_s '{print $2}'
command |
awk -F_T\|_s '
{
print $2
}
'
和:
command | awk -F_T\|_s '{print $3}'
command |
awk -F_T\|_s '
{
print $3
}
'
command
输出文件的命令在哪里。
-F_T\|_s
:设置_T
和_s
作为输入字段分隔符;{print $2}
:打印第二个字段。{print $N}
:打印第 3 个字段。
% cat file
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
% cat file | awk -F_T\|_s '{print $2}'
8
8
8
10
10
10
% cat file | awk -F_T\|_s '{print $3}'
1
5
10
1
5
10