sed를 사용하여 내용에 따라 파일 이름을 일괄적으로 바꾸시겠습니까?

sed를 사용하여 내용에 따라 파일 이름을 일괄적으로 바꾸시겠습니까?

이 패턴을 모두 포함하는 파일이 많이 있습니다 SIZE1=%d. 해당 소수점을 찾아 각 파일 이름에 접두사를 추가하는 방법이 있습니까 %d_?

또한 모든 파일이 포함된 경우 SIZE1=%d모든 SIZE2=%e파일 이름에 접두사를 추가할 수 있습니까 %d_%e_?

sed나는 이것에 경험이 없기 때문에 내가 얼마나 할 수 있는지 알아보려고 노력하고 있습니다 .

편집: 예를 들어 test_result.log파일 어딘가에 별도의 줄이 있고 파일 이름 SIZE1=100을 .SIZE2=150100_150_test_result.log

답변1

GNU sed를 사용하면 2단계 sed 호출로 이를 수행할 수 있습니다. 먼저 몇 가지 테스트 데이터를 생성합니다.

for i in {1..10}; do 
  if (( RANDOM%2 )); then 
    echo SIZE1=$((RANDOM%10)) > test$i.log
  else 
    echo SIZE1=$((RANDOM%10)) SIZE2=$((RANDOM%10)) > test$i.log
  fi
done

생성된 데이터를 확인합니다.

head test*

산출:

==> test10.log <==
SIZE1=7

==> test1.log <==
SIZE1=5

==> test2.log <==
SIZE1=4 SIZE2=1

==> test3.log <==
SIZE1=9

==> test4.log <==
SIZE1=9 SIZE2=8

==> test5.log <==
SIZE1=6

==> test6.log <==
SIZE1=6

==> test7.log <==
SIZE1=5

==> test8.log <==
SIZE1=4 SIZE2=3

==> test9.log <==
SIZE1=3 SIZE2=8

SIZE1sum first 를 포함하는 모든 파일 을 찾으려면 SIZE2단락 모드, 즉 b성공적인 일치 후 다음 파일로 분기( )를 사용합니다.

매개변수 추출.sed

/.*SIZE1=([0-9]+).*SIZE2=([0-9]+).*/ { F; s//\n\1_\2_\n/; p; b; }
/.*SIZE2=([0-9]+).*SIZE1=([0-9]+).*/ { F; s//\n\2_\1_\n/; p; b; }
/.*SIZE1=([0-9]+).*/                 { F; s//\n\1_\n/;    p; b; }

매개변수와 파일 이름이 있으면 필요한 명령을 작성합니다.

cmds.sed 생성

N
s/([^\n]*)\n(.*)$/mv \1 \2\1/

다음과 같이 실행하세요:

sed -znsEf extract-params.sed test* | sed -Ef create-cmds.sed

산출:

mv test1.log 5_test1.log
mv test2.log 4_1_test2.log
mv test3.log 9_test3.log
mv test4.log 9_8_test4.log
mv test5.log 6_test5.log
mv test6.log 6_test6.log
mv test7.log 5_test7.log
mv test8.log 4_3_test8.log
mv test9.log 3_8_test9.log
mv test10.log 7_test10.log

이제 이를 쉘에 파이프로 연결하거나 GNU sed의 /e모드 수정자를 사용할 수 있습니다.

관련 정보