当前输入来自命令
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
这会将两行修改后的行保存到output1
和output2
测试:
$ 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
下次尝试更多地使用谷歌,你可以在某处找到这两个命令的答案。
答案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