rm 화면에 인쇄된 "==" 오른쪽에 있는 모든 파일

rm 화면에 인쇄된 "==" 오른쪽에 있는 모든 파일

다음을 인쇄하는 스크립트가 있습니다.

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.

여기서 일어나는 일은 다음과 같습니다.

  1. 프로그램의 출력은 sed첫 번째 파이프를 통해 다음으로 전송됩니다.|
  2. 출력의 각 줄에 대해 sed처음( 표시됨 ^)부터 기호까지 의 ==모든 내용이 문자로 대체됩니다 rm. sed두 번째 파이프를 사용하여 나머지 회선을 다른 호출로 보냅니다.
  3. sed이제 공백과 여는 괄호( 로 표시 \ \() 및 그 뒤에 오는 괄호( 로 표시) 를 찾아 제거합니다 .*.
  4. bash 실행이 출력되도록 전체 명령이 래핑됩니다 $(...)(이 경우 명령 문자열) rm new_GS_calculation/... .

관련 정보