다음을 인쇄하는 스크립트가 있습니다.
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
쉘 스크립트에서 이 프로세스를 어떻게 자동화할 수 있습니까? 감사해요.
답변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/...
.