我有一个打印的脚本:
dhcp-18-189-47-44:CE06_getting_new_fit myname$ ./find-duplicate-structures.sh custom_structures new_GS_calculation/selected/POSCAR_00*
../CE05-structures_recombined/enum-00135/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0011 (RMSD = 1.15475827927e-06, max. displacement = 1.41428428091e-06)
../CE05-structures_recombined/enum-00146/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0022 (RMSD = 1.16051714442e-06, max. displacement = 1.42835572031e-06)
../CE05-structures_recombined/enum-00150/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0027 (RMSD = 3.40556388834e-16, max. displacement = 6.04819551804e-16)
../CE05-structures_recombined/enum-00151/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0027 (RMSD = 4.01650747941e-16, max. displacement = 5.4726685759e-16)
../CE05-structures_recombined/enum-00163/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0037 (RMSD = 1.99174954223e-06, max. displacement = 2.44948961046e-06)
在内部,脚本如下所示:
dirs=$1
shift
while read dir
do
if [ -f $dir/POSCAR.ideal ]
then poscar=$dir/POSCAR.ideal
else poscar=$dir/POSCAR
fi
mg match --just-match $poscar $@
done < $dirs
exit 0
打印发生在 mg match --just-match $poscar $@ 行
但是,在我的实践中,我想将所有内容删除到右侧的“==”,即:
rm new_GS_calculation/selected/POSCAR_0011
rm new_GS_calculation/selected/POSCAR_0022
rm new_GS_calculation/selected/POSCAR_0027
rm new_GS_calculation/selected/POSCAR_0037
如何在 shell 脚本中自动执行此过程?谢谢 。
答案1
sed
您可以尝试使用以下命令解析程序的输出并执行:
$(./YOUR_PROGRAM | sed s/^.*==/rm/ | sed s/\ \(.*//)
将执行(从你的例子)
rm new_GS_calculation/selected/POSCAR_0011
rm new_GS_calculation/selected/POSCAR_0022
rm new_GS_calculation/selected/POSCAR_0027
rm new_GS_calculation/selected/POSCAR_0027
rm new_GS_calculation/selected/POSCAR_0037
sed
使用以下语法:
sed s/string1/string2/
替换string1
为string2
.
这里发生的事情是:
- 程序的输出
sed
通过第一个管道发送到|
- 对于输出的每一行,
sed
从开头(用 标记^
)到==
符号的所有内容都将其替换为字母rm
。它将该行的其余部分发送到sed
带有第二个管道的另一个调用中 sed
现在查找并删除一个空格,后跟一个左括号,用 表示\ \(
,以及后面的任何内容,用 表示.*
。- 整个命令被包装起来,
$(...)
以便 bash 执行输出,在本例中是一串rm new_GS_calculation/...
命令。