나는 성공하지 못한 채 한동안이 문제를 다루어 왔습니다. sed가 필요해요
1.0.0/hk/base/9/7/56.png2003444
이것을 입력하세요
hk,9,7,56,200,3444
어떤 도움이라도 대단히 감사하겠습니다.
편집하다.
첫 번째 줄은 파일 내의 문자열을 나타냅니다. 두 번째 줄 - 결과가 CSV 파일에 사용됩니다.
섹션에는 고정된 수의 문자가 포함됩니다(항상). 1.0.0/hk/base/
섹션은 문자 수에 따라 달라질 수 있습니다.9/7/56 2003444
나는 이렇게 하라는 지시를 받았습니다:
-e 's/\/base\//,/g'
다음을 반환합니다:
1.0.0/hk,9/7/56.png2003444
하지만 다른 일을 처리하는 방법을 모르겠습니다.
답변1
이 문자열의 경우 다음 변환이 작동합니다.
sed 's|.*/\(.*\)/.*/\(.*\)/\(.*\)/\(.*\)\.png\(...\)\(....\)|\1,\2,\3,\4,\5\,\6|'
마지막 두 부분의 길이가 다른 경우를 포함하여 다른 줄의 형식이 정확하게 지정되지 않은 경우 문제가 발생합니다.
답변2
파일이므로 Vim으로 하겠습니다. 윔스환상적이다정규식은 읽기가 매우 쉬우므로 훌륭한 교육 자료입니다.
:%s_\v^.{6}([^/]+)/([^/]+)/(\d+)/(\d+)/(\d+)\.png(\d{3})(\d{4})_\1,\2,\3,\4,\5,\6,\7_
\v
매우 마법 같은 기능을 켜세요^
줄의 처음부터 일치.{6}
처음 6자 가져오기(1.0.0/
)([^/]+)
/
(hk
) 가 아닌 것/
이것/
([^/]+)
우리는 전에 만난 적이 있어요(base
이 경기)/
-- || -- ||(\d+)
숫자 일치(9
)/(\d+)/(\d+)
소중한 것을 반복하세요 (/7/56
)\.png
이것은 분명해야합니다(\d{3})
정확히 세 개의 숫자200
(\d{,4})
최대 4개의 숫자(더 강력하게 만들기 위해):3444
sed
{}()[]
( 이스케이프 및 삭제가 필요한 모든 항목과 함께 사용 \v
)
답변3
구문 분석 중인 텍스트의 구조나 검색하려는 패턴을 알려주지 않았습니다. 그래서 나는 당신이 우리에게 준 예를 바탕으로 몇 가지 가정을 했습니다. ( 1.0.0/hk/base/9/7/56.png2003444
).
-r
괄호와 대괄호를 이스케이프 처리하면 스크립트를 읽기가 어려워지기 때문에 확장 정규식( )을 사용했습니다. ;
슬래시( ) 대신 세미콜론( )을 사용하여 /
명령을 구분하므로 슬래시도 이스케이프할 필요가 없습니다.
sed -r 's;([0-9]+\.){2}[0-9]+/([a-zA-Z]+)/[a-zA-Z]+/([0-9]+)/([0-9]+)/([0-9]+)\.[a-zA-Z]{3}([0-9]{3})([0-9]{4});\2,\3,\4,\5,\6,\7;g'
답변4
모든 답변에 감사드립니다. 나는 프로그래밍 세계에 처음 입문했고 이것은 나에게도 새로운 일입니다. 그래서 이것이 sed
이 문제에 접근하는 구식 방식이기 때문에 배울 것이 많다고 생각합니다 . 그러나 나는 나에게 익숙한 특정 접근 방식을 따랐기 때문에 결국 다음과 같이 문제를 해결하게 되었습니다.
sed -e 's/1.0.0\///g' \
-e 's/\/base\//,/g' \
-e 's/\//,/g' \
-e 's/.png/,/g' \
-e 's/,\([0-9][0-9][0-9]\)\([0-9]*\)$/,\1,\2/g'