使用 sed 裁剪字符串

使用 sed 裁剪字符串

我有一个命令,可以输出具有以下模式的列表

exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
...

如何使用sedbash 中的类似方法分别获取“_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

相关内容