파일 이름을 바꾸고 하위 문자열을 변수 값으로 바꿉니다.

파일 이름을 바꾸고 하위 문자열을 변수 값으로 바꿉니다.

다음과 같은 파일 이름 구조를 가진 파일 세트가 있습니다.

aa_bbbbb_cccccccc_dddddd.txt

세 번째 요소를 파일 내용에서 추출한 cccccccc변수 값으로 바꾸고 싶습니다.value

파일 이름의 4개 구성 요소의 값이 변경되어 문자열 대체를 사용하여 대체할 수 없지만 대체하려는 하위 문자열의 위치를 ​​기준으로 대체해야 합니다.

bash 스크립트만 사용하여 이 문제를 해결하는 방법에 대한 제안이 있으십니까?


이름 바꾸기를 사용할 수 없습니다. cygwin에서는 작동하지 않는 것 같고 어쨌든 문자열 교체를 사용할 수 없습니다. "_"를 구분 기호로 간주하는 경우 세 번째 필드를 변수에 포함된 값으로 바꿔야 합니다.

답변1

bash실제로 ksh 또는 POSIX의 연산자만큼 어색한 분할 연산자가 있습니다 sh. 따옴표 없이 인수를 확장하면 IFS 분할이 수행됩니다.

cmd $var

하다$var$IFS악명 높은 분할+글로브 연산자라고도 알려진 문자를 분할하고 와일드카드도 수행합니다.

일반적 으로 옵션을 허용하는 명령의 cmd "$var"경우에도 일반적으로 필요하기 때문에 원하지 않습니다 .cmd -- "$var"

하지만 여기서는 분할에 사용할 수 있습니다 _.

그리고:

IFS=_
set -o noglob
parts=( $file'' )

$file분할되어 _결과 부분이 $parts배열에 저장됩니다.

그러면 다음과 같이 할 수 있습니다:

parts[2]=$value

세 번째 부분을 변경합니다(bash에서는 ksh와 같지만 대부분의 다른 쉘과 달리 배열 요소 인덱싱은 0에서 시작하므로 세 번째 요소 는 에 있습니다 ${parts[2]}).

_다음을 사용하여 팩에 추가 할 수 있습니다 .

newfile="${parts[*]}"

답변2

value변수가 있는 파일의 예

value=xxx

그런 다음 사용진주의rename:

file=aa_bbbbb_cccccccc_dddddd.txt
rename -n 's/^(.+?_.+?)_.+?_(.*)/${1}_foo_$2/' ./"$file"

출력이 만족스러우면 제거하십시오 -n(일명).dry-run

답변3

사용Bash 매개변수 확장:

  • ${parameter##word}word일치하는 가장 긴 접두사 패턴을 제거합니다.parameter
  • ${parameter%word}word가장 짧은 일치 접미사 패턴 제거parameter
file="aa_bbbbb_cccccccc_dddddd.txt"
value="replace me"

suffix=${file##*_}  # dddddd.txt
prefix=${file%_*}   # aa_bbbbb_cccccccc
prefix=${prefix%_*} # aa_bbbbb

mv "$file" "${prefix}_${value}_${suffix}"

또는 더 짧음

file="aa_bbbbb_cccccccc_dddddd.txt"
value="replace me"
prefix=${file%_*}

mv "$file" "${prefix%_*}_${value}_${file##*_}"

관련 정보