위치 대신 문자를 사용하여 부분 문자열 추출

위치 대신 문자를 사용하여 부분 문자열 추출

최근에 노틸러스 스크립트를 사용하기 시작했는데, 작성 중인 스크립트의 경우 파일 이름에서 하위 문자열을 추출해야 합니다. 내 문제는 내가 기반을 다지는 방법을 많이 찾았다는 것입니다.위치문자열에서 주어진 문자를 찾고 해당 문자에서 또는 해당 문자까지 부분 문자열을 추출하는 방법에 대한 내용이 아닌 문자.

cut -f1 -d "delimiter"

유효하지만 cut1개의 문자 구분 기호만 사용할 수 있습니다.

어쩌면 awk아니면 expr?

편집:
저는 bash로 글을 쓰고 있습니다. 예를 들어 다음과 같은 이름의 파일이 있을 것으로 예상합니다.

[email protected]

간단히 이름을 바꾸십시오.

Any Series S01 E01 VOSTFR.avi

답변1

POSIX 쉘의 경우 다음을 사용하십시오.패턴 제거 매개변수 확산 연산자(원래 Korn 쉘에서):

string=whateverDELIMrestDELIMmore
before_first_DELIM=${string%%DELIM*}
before_last_DELIM=${string%DELIM*}
after_first_DELIM=${string#*DELIM}
after_last_DELIM=${string##*DELIM}

답변2

이 스크립트를 어떻게 사용하고 싶은지 이미 적어 두셨다면 더 구체적인 답변을 드릴 수 있지만, 다음 줄만 사용해도 귀하의 필요에 맞게 적용할 수 있을 것 같습니다.

$ echo "abcde" | awk '{print substr($0, index($0, "c"))}'
cde

index두 번째 매개변수를 원하는 문자로 바꾸세요 .

답변3

매개변수 확장이 실제로 작업을 수행합니다.

echo ${1%.S??E*}|sed 's/\./ /'

시리즈 이름을 에코하고 잠재적인 점을 공백으로 변경합니다. 어떤 시리즈에도 적용할 수 없지만(예: Mr. Robot에는 포인트가 필요함) 이는 충분히 가깝습니다.

답변4

예시만 제시하셨습니다. 더 많은 것이 더 좋을 것입니다!

[email protected]

당신은 그것을 다음과 같이 나누고 싶습니다 :

  • Any Series
  • S01
  • E01
  • VOSTFR
  • avi

언뜻 보면 이는 첫 번째 필드(이름)에 다른 곳에서 사용되는 구분 기호가 포함될 수 있는 RPM 패키지 명명 문제와 크게 다르지 않습니다. 그러나 두 필드로 분할하려는 고정 형식 필드가 있다고 가정합니다.

그러기 위해 나는 헤어질 것이다시즌 + 에피소드:

IFS=';' episode=( $(echo "$FILENAME"|sed -E 's/(.+)\.(S[0-9]{2})(E[0-9]{2})\.([^\.]+)\..*\.([^\.]+)/\1;\2;\3;\4;\5/') )

할당 범위의 구분 기호를 세미콜론으로 설정한 다음 정규 표현식의 출력을 bash 배열에 삽입합니다. 이 배열에는 5개의 필드가 있습니다.${episode[0]} .. ${episode[4]}

에피소드 이름 필드의 점을 공백으로 확장하지 않았습니다. 아마도 한 번에 모든 것을 수행할 수 있지만 개별적으로 처리하면 밑줄 사용과 같은 작업을 수행하거나 ..->의 경우 이중 찾기와 같은 복잡성을 추가할 수 있습니다. 간단히:Mr..RobotMr. Robot

episode[0]="${episode[0]//./ }"

더 복잡하게 만들려면 ." "와 같이 약어를 나타내는 곳에 보관하세요 Mr. Robot.

episode[0]="$(echo "${episode[0]}"|sed -E 's/\.([^\.])/ \1/g')"

마지막으로 배열 확장을 사용하여 대상 파일 이름을 구성하여 공백, 마침표, 마지막 필드로 구분된 필드 #0의 4개 필드를 인쇄합니다.

TARGET="${episode[@]:0:4}.${episode[4]}"

FILENAME그런 다음 and 를 전달하면 TARGET따옴표 mv를 사용하는 것이 안전합니다.

mv "$FILENAME" "$TARGET"

관련 정보