Bash에서 여러 구분 기호로 문자열 분할

Bash에서 여러 구분 기호로 문자열 분할

문자열이 있습니다:

onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt

나는 그것을 분할 .하고 ;파일 이름 앞의 접두사를 제거하여 다음과 같이 보이도록 하고 싶습니다.

file.001.txt ; file.0.98.txt ; file.14.txt

어떤 아이디어가 있나요?

답변1

sed -e 's/[^.]*.//' -e 's/;[^.]*./; /g'

이는 먼저 처음부터 끝까지 가장 짧은 부분 문자열을 제거한 .다음 ;결과 문자열에 대한 작업을 수행할 수 있습니다.

답변2

가져가다"카니발에서"말 그대로 이런 일을 할 수 있습니다.

  • 문자열을 배열로 분할하고 세미콜론으로 구분합니다.

  • 요소별로 접두사를 제거하고 결과를 IFS의 첫 번째 문자로 구분된 문자열에 저장합니다.

  • 구분 기호 뒤에 공백을 전역적으로 추가합니다.

IFS참고: 나중에 복원할 수 있도록 현재 상태를 저장하고 싶을 수도 있습니다 .

IFS=";"
read -a arr <<< "onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
printf -v str "${arr[*]#*.}"
printf "%s\n" "${str//;/; }"

주다

file.001.txt ; file.0.98.txt ; file.14.txt

답변3

아니면 sed...

s="onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
sed -E "s/(^|; )[^\.]+\./\1/g" <<<$s

송곳

(^|; )[^\.]+\.

^줄의 시작 부분에서 시작하거나 (세미콜론 및 공백) |으로 시작 ;하고 뒤에 [^\.]+\.텍스트가 없는 연속 시퀀스가 .​​오는 모든 하위 요소를 찾습니다.하다텍스트로 끝남.

\1그런 다음 모든 것을 캡처 그룹 으로 바꿉니다.(^|; )

산출

file.001.txt ; file.0.98.txt ; file.14.txt

관련 정보