如何在 Grepping 时进行切割

如何在 Grepping 时进行切割

当前输入来自命令

grep -i "final_model" /dir1/dir2/dir3/user/dir4/assemble.preprocessing

当前输出为:

final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>

所需的 Output-1 为:

test_F00ME001.inp

所需的 Output-2 为:

F00ME001

答案1

假如说

final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>

grep是您的命令生成的一行文本,

grep ... | sed 's#.*/##; s/>$//' | tee output1 |
           sed 's/^[^_]*_//; s/\..*//' >output2

这会将两行修改后的行保存到output1output2

测试:

$ printf '%s\n' 'final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>' |
  sed 's#.*/##; s/>$//' | tee output1 |
  sed 's/^[^_]*_//; s/\..*//' >output2
$ cat output1
test_F00ME001.inp
$ cat output2
F00ME001

第一个sed调用对原始数据进行操作,并首先删除最后一个/字符之前的所有内容。然后它会删除>末尾的 。

tee其保存output1并传递到管道的下一个阶段。

第二个sed调用对修改后的数据进行操作,并首先删除第一个字符之前的所有内容_。然后,它删除从第一个点开始的所有内容,并将结果重定向到output2.

答案2

尝试使用以下命令来实现相同的效果

final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>

o1=`echo $final_model| awk -F "/" '{print $NF}'|sed "s/[^[a-zA-Z_0-9.]//g"`

echo $o1

o2=`echo $o1|awk -F [_.] '{print $2}'`

echo $o2

F00ME001

答案3

$ final_model="</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>"
$ o1=$(echo "$final_model" | sed -e 's/<\(.*\)>/\1/')   #remove <>
$ o1=$(basename "$o1")   #get basename (test_F00ME001.inp)
$ echo "$o1"
test_F00ME001.inp
$ o2=$(echo "$o1" | sed -e 's/test_\(.*\)\.inp/\1/')   #get text between test_ and .inp
$ echo "$o2"
F00ME001

下次尝试更多地使用谷歌,你可以在某处找到这两个命令的答案。

sed命令源:https://stackoverflow.com/a/13242517/7351855

答案4

将 替换grep -i final_model为 perl,然后捕获所需的数据:

$ perl -nE '/^final_model=.*\/(test_([^.]+)[^>]+)/ && say "$1\n$2"' assemble.preprocessing
test_F00ME001.inp
F00ME001

第一组捕获括号捕获最后一个斜杠之后的内容:(test_([^.]+)[^>]+)
第二组捕获括号捕获下划线和点之间的内容。

然后您可以使用以下结构将这两行捕获到变量中:

{ read output1; read output2; } < <(
    perl -nE '/^final_model=.*\/(test_([^.]+)[^>]+)/ && say "$1\n$2"' assemble.preprocessing 
)

我们正在重定向流程替代分成 2 个读取命令的分组。

$ echo "$output1"
test_F00ME001.inp
$ echo "$output2"
F00ME001

相关内容