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

관련 정보